我现在有一个拓扑运行了几天,它开始在过去几天失败了元组。从日志看来,元组似乎没有到达螺栓,附加的是Storm UI截图。 我在代码中最后中的元组,所以没有任何un'acked元组的情况,并且超时设置为10秒,这比UI上显示的时间要高。 / p>
答案 0 :(得分:1)
你所看到的日志就是Kafka鲸鱼喷水,它告诉你它已经落后太多了,它已经开始跳过元组了。
我认为只有一个元组会计入完整的延迟时间指标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设置为您认为合理的任何内容来限制挂起元组的数量(类似于您认为可以在超时内处理的元组数)