【问题标题】:Tuples failing at the spout, and seems they are not even reaching the Bolt元组在喷口处失败,似乎它们甚至没有到达螺栓
【发布时间】:2018-02-17 03:21:05
【问题描述】:

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

任何提示?enter image description here

【问题讨论】:

  • 我确实在日志中看到以下消息,不确定是否相关.. worker.log:2018-02-16 03:59:16.727 o.a.s.k.PartitionManager [WARN] Removing the failed offsets for Partition {host=10.180.40.249:9992, topic=XXXXX_XXXX, partition=1} 超出范围:[9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9581, 9566]

标签: apache-storm apache-storm-topology


【解决方案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 设置为您认为合理的任何值来限制待处理元组的数量(例如您认为可以在超时内处理的元组数量)

【讨论】:

  • 当你说开始跳过元组时,这是否意味着..它可能正在跳过元组,我希望它处理?关于延迟,我同意解释,元组绝对没有达到螺栓。 (因为我在那里有一个日志声明,它本可以告诉我的。)
  • 是的,有点。虽然您可以将 KafkaSpout 配置为仅重试消息一定次数,但这不是此处记录的内容。您看到的日志发生在这里github.com/apache/storm/blob/master/external/storm-kafka/src/…。如果 spout 正在重试消息,并且该消息在 Kafka 中不再可用(例如,由于主题压缩或段删除),则会发生这种情况。我认为由于某种原因,记录的偏移量不再存在于 Kafka 中。结果,spout 停止尝试获取它们。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
相关资源
最近更新 更多