Storm 集群 UI 上有大量 Failed 数据
问题描述
客户在拓扑中使用了 ACK 机制,在 Storm UI 上出现大量 Failed 数据,导致整体事件端到端的延迟很大。
问题分析
当 Spout 接收到大量数据,而后端 Bolt 处理较慢,如果 Spout 发送的事件在超时时间(topology.message.timeout.secs
默认为 30s
)内没有最终 ACK 闭环,即在超时时间内最初的原始消息没有最终获得处理完成的 ACK 响应时,该事件成为 Fail 事件。当输入数据量大,且后端处理较为耗时,而无法在设定时间内处理完且 ACK 时,则会造成超时 Fail。
解决方法
请尝试以下方法:
增加
topology.message.timeout.secs
默认超时时间,如60s
。观察系统 ACK 线程处理性能,如 UI 界面中的:
如果该 ACK 线程处理性能较低可考虑增加 ACK 的线程数:
topology.acker.executors
(默认为null
,即与该任务的 Work 数一致),可设置为 worker 的倍数。减少
topology.max.spout.pending
(默认为null
,即不做限制),该配置项可以对 Spout task 接收速度进行流控,例如可以从设置topology.max.spout.pending = 1024
开始,即表示当 Spout 发送的数据已经将该 pending 队列占满,则在该队列满没有空间时,Spout 的 nextTuple() 方法不被调用,即进行了流控。
可能的影响
topology.max.spout.pending
设置后,会降低整个系统的吞吐量,可以先从 1024 开始,不断增加,最终达到系统稳定且吞吐量合适。