繁体   English   中英

Storm KafkaSpout失败的元组重复

[英]Storm KafkaSpout failed tuples duplicated

我正在使用storm-kafka-1.1.1-plus和storm 1.1.1。 使用BaseRichBolt,一个KafkaSpout和两个螺栓A,Bolt B进行配置一旦螺栓B确认将其视为已成功处理的元组并将其提交,则将元组锚定在螺栓A中 但是,问题是由于某种原因,某些失败的消息在KafkaSpout中被复制了

例如

KafkaSpout在处理它时发出了1000个元组,由于某种原因,有近20个元组失败了(在B位置)。 那20个元组是连续重放的,在某个时候,工人被杀死了,主管重新启动了该工人,然后又重放了这20个元组,这次它成功地处理了,但是处理了多次(重复)。

在此处输入图片说明

但是,我希望这些元组只能被处理一次(成功)。 我已将topology.enable.message.timeouts设置为false 我的另一个问题是,Storm将在哪里存储那些失败的Kafka偏移详细信息 我没有在Zookeeper上找到它,它只有以下细节。

{“ topology”:{“ id”:“ test_Topology-12-1508938595”,“ name”:“ test_Topology”},“ offset”:505,“ partition”:2,“ broker”:{“ host”:“ 127.0 .0.1“,”端口“:9092},”主题“:” test_topic_1“}

禁用消息超时可能会导致消息丢失,如果需要处理所有消息,则可能需要重新考虑禁用它。

启用确认后,Storm会提供一次最少的处理保证。 您可能想看看是否可以使螺栓等幂,因此重播不会引起问题。 或者,您可以查看https://storm.apache.org/releases/1.1.1/Trident-tutorial.html ,它提供了一次精确的状态更新。

编辑:您可能需要重新考虑您的问题。 据我所知,没有任何流处理系统可以提供听起来像您想要的那样的一次精确处理。

Trident提供的精确语义是Trident将帮助您使状态更新成为幂等,因此从您的数据存储的角度来看,它看起来像消息仅被处理一次。 处理仍至少一次。 有关如何操作的直观信息,请参见https://storm.apache.org/releases/2.0.0-SNAPSHOT/Trident-state.html上的“事务处理喷嘴”一节(可能还有页面的其余部分)。 基本思想是将有关已写入消息的信息存储在数据存储中,这样,如果重复这些消息,则状态更新代码可以忽略它们。

您可能还想阅读https://streaml.io/blog/exactly-once 我想说的是Flink实现了类似于此处描述的分布式快照算法的方法,这是在最少一次系统中一次精确模拟的另一种方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM