当前位置: 首页 > 知识库问答 >
问题:

Storm螺栓断裂,但喷口失效

皇甫飞跃
2023-03-14

我对Apache Storm有一个奇怪的问题。我有一个Kafka连接到Kafka集群,里面有10条消息。

螺栓接收每条消息并正确处理,因为在Storm UI中,螺栓被列为“已确认”。然而,storm UI下面列出的喷口表示所有元组都失败了。

我相信这会导致喷口再次发出所有的信息。。。因此,我看到一个Storm螺栓打印出消息1-10,然后以相同的顺序一次又一次地打印出来。

我适当地调用了. ack().失败()方法,我只是不知道为什么Spout会将它们列为失败。

有什么想法吗?

共有2个答案

岳刚洁
2023-03-14

当spout读取消息并将其传递给Bolts时,消息应在TOPOLOGY_MESSAGE_TIMEOUT_SECS/"topology.message.timeout.secs"内完成完整处理(所有相关的Bolts)

所有相关螺栓必须确认,然后确认器向喷口指示消息已被处理(如果是Kafka喷口,则喷口将增加偏移量)。

如果您在日志中看到喷口失败,可能:

  1. 您的一个螺栓未通过消息
  2. 您的一个螺栓未确认
  3. 螺栓未完成拓扑中的消息处理。消息超时。秒,因此ack未按时发送

#3示例:如果您有5个螺栓,由于db连接问题,每个螺栓大约需要10秒,因此在螺栓#3之后,您将通过默认的30秒Storm超时,并且无法处理消息。喷口将再次重播此消息。

因此,您可以提高超时html" target="_blank">配置,或者更快地失败(例如:更短的db连接超时),或者有时降低TOPOLOGY_MAX_SPOUT_PENDING也可以帮助解决大量消息等待处理的情况,并且更早的消息需要很长时间。

有关更多信息,请参阅apache-保证消息处理。

晏树
2023-03-14

事实证明,下游的一些螺栓在完成元组处理时并没有确认。这导致喷口元组失败,并最终再次发送该元组,从而导致连续循环

 类似资料:
  • 因此,如果您使用基于JUnit的单元测试,是否建议您运行一个小型模拟拓扑(?)并测试该拓扑下的(或)的隐含契约?或者,是否可以使用JUnit,但这意味着我们必须仔细模拟Bolt的生命周期(创建它、调用、嘲弄等)?在这种情况下,被测类(螺栓/喷口)有哪些一般的测试点需要考虑? 其他开发人员在创建正确的单元测试方面做了什么? 我注意到有一个拓扑测试API(参见:https://github.com/x

  • 编辑:我向Bolt添加了一个。ack()(这要求我使用一个丰富的Bolt而不是基本的Bolt)并且遇到了同样的问题--没有任何信息告诉我Bolt正在处理元组。 如果有关系的话,我会在EC2实例上的CentOS映像上运行这个。如有任何帮助,不胜感激。 查看生成的Storm worker日志,我看到这一行: 下面几行如下: 工作日志的其余部分没有显示螺栓处理的消息的日志/打印。我不明白为什么螺栓似乎没

  • 在我的拓扑中,当元组从spout转移到bolt或从bolt转移到bolt时,我看到大约1-2 ms的延迟。我使用纳秒时间戳来计算延迟,因为整个拓扑运行在单个Worker中。拓扑是在集群中运行的,集群运行在具有生产能力的硬件中。 根据我的理解,在这种情况下,元组不需要序列化/反序列化,因为所有东西都在单个JVM中。我已经将大多数喷流和螺栓的并行性提示设置为5,并且喷流仅以每秒100的速率产生事件。我

  • 我正在本地开发一个Storm拓扑。我正在使用Storm 0.9.2孵化,并开发了一个简单的拓扑。当我使用LocalCluster()选项部署它时,它工作得很好,但它不会显示在我的Storm UI中,它只是执行而已。 当我定期部署它时,它会在我的Storm UI中显示拓扑结构,但当我单击它时,不会看到喷口或螺栓。 我还尝试了许多Storm启动项目中的示例WordCountTopology。同样的行为

  • 来自Kafka喷泉的Storm--有条件消耗的溪流? 我如何获得这个bolt中数据中所有字段的模式,而不是基本上重新解析所有数据并重新创建它?

  • 我在本地模式下运行Apache Storm拓扑,它工作正常,但是当我将其提交给Storm时,喷口和螺栓不会显示在StormUI中,除了拓扑。 有人建议监督员应该运行,我也尝试过,即监督员、雨云和动物园管理员运行良好。提前谢谢。有人问了类似的问题,这表明监督员应该在阿帕奇Storm上——喷口和螺栓不存在于StormUI...但这在我的情况下不起作用任何想法,请。