apache-kafka - Apache Storm:KafkaSpout 有很多因超时而失败的元组
问题描述
在我的 processtime-window wordcount 拓扑中,输入速率是 2000 tuple/s。我的 count_bolt 的窗口大小是 3s 和 1s 滞后。从 UI 可以看出有大量的失败元组。通过查看日志,元组失败的原因是超时。我也设置TOPOLOGY_MAX_SPOUT_PENDING
为10000,<code>topology.message.timeout.secs 为60。根据图中Capacity
和的两个参数Execute latency
,bolt的并行度应该足够了。
问:我应该如何调整参数?比如,TOPOLOGY_MAX_SPOUT_PENDING
<code>topology.message.timeout.secs 或者别的什么。
这是我的storm UI的图片: storm UI
解决方案
我会先降低topology.max.spout.pending
. 一旦您的拓扑不会无用地处理已经超时的元组,就应该更容易判断瓶颈在哪里。
请记住,容量/执行延迟仅考虑execute
每个元组花费了多少时间。
我记得 Kafka Bolt 在离开之前不会确认元组execute
,而是将元组传递给生产者并通过生产者的回调确认元组,这可能在execute
返回后发生。因此,您不会看到在 Kafka Bolt 中处理元组所花费的实际时间反映在容量/执行延迟中。execute
您可以在进程延迟中看到元组到达和被确认的元组之间的实际时间,这是相当高的。
您的 count_bolt 进程延迟也很高,因此在确认元组之前,请查看该进程是否也在缓冲元组。
推荐阅读
- python - 致命:[cor-001]:失败!=> {"changed": false, "msg": "junos-eznc (aka PyEZ) >= 2.1.7 is required for this module. 但是,junos-eznc 不是
- javascript - 动态复选框的Angular 4触发事件
- javascript - 树的标头的Javascript数组
- reporting-services - 改变SSRS图表中同系列数据标记的颜色
- c# - 在 ActionFilter 中间件中使用 DbContext
- openlayers - GetLegendGraphic 显示水平GeoServer
- mysql - 如何编写一个引用表中字段的 MySQL 函数?
- ios - 不同文件 React Native 中未定义的方面
- python - Python 3 - 在类外发出调用类方法
- javascript - 禁用 html5 contenteditable 属性的默认浏览器行为