0

我现在有一个拓扑运行了几天,它从最近几天开始使元组失败。从日志看来,元组没有到达螺栓,附件是 Storm UI 屏幕截图。我在我的代码中最终确认元组,所以没有未确认元组的情况,并且超时设置为 10 秒,这比 UI 上显示的时间要高。

任何提示?在此处输入图像描述

4

1 回答 1

1

您看到的日志只是 Kafka spout 告诉您它已经落后太多,并且它已经开始跳过元组。

我相信只有 acked 元组才算完整的延迟指标https://github.com/apache/storm/blob/a4afacd9617d620f50cf026fc599821f7ac25c79/storm-client/src/jvm/org/apache/storm/stats/SpoutExecutorStats.java#L54。失败的元组不会(Storm 怎么知道超时的元组的实际延迟是多少),所以您看到的完整延迟仅适用于最初的一对确认元组。

我认为正在发生的事情是您的元组正在到达螺栓,然后您没有确认它们(或多次确认它们),或者元组处理时间太长,因此它们在排队等待螺栓时超时. 请记住,元组超时在 spout 发出元组时开始,因此在螺栓的输入队列中花费的时间很重要。由于您最初的几个元组需要一段时间来处理,我认为螺栓队列得到了已经超时的元组的备份。Bolt 不会丢弃超时的元组,因此排队的超时元组会阻止及时处理新的元组。

我会提高元组超时,并通过将 topology.max.spout.pending 设置为您认为合理的任何值来限制待处理元组的数量(例如您认为可以在超时内处理的元组数量)

于 2018-02-16T19:21:05.253 回答