Kafka Spout多次阅读同一条消息

时间:2015-02-19 13:13:35

标签: apache-storm apache-kafka kafka-consumer-api

如果我在风暴拓扑中增加Kafka喷口的并行度,如何阻止它多次在主题中读取相同的消息?

5 个答案:

答案 0 :(得分:0)

Storm的Kafka spout持续消费者抵消Zookeeper,所以只要你不清除你的Zookeeper商店,它就不应该多次读取同一个消息。如果您看到多次读取消息,或许可以检查偏移量是否持久保存到您的zookeeper实例?

我认为默认情况下,在本地运行时,Kafka spout会启动自己的本地Zookeeper实例(与Kafka的Zookeeper分开),每次重新启动拓扑时都可能会重置其状态。

答案 1 :(得分:0)

您应该检查消息是否得到了正确的确认。如果没有,那么喷口会将其视为失败,并将回复该消息。

答案 2 :(得分:0)

如果是从卡夫卡流入暴风雨,请分享更多信息。

如果数据流从风暴到卡夫卡:

然后只需在代码中检查您的TopologyBuilder。

不应为allGrouping,如果是,则将其更改为shuffleGrouping

示例:

    builder.setBolt("OUTPUTBOLT", new OutBoundBolt(boltConfig), 4)
            .allGrouping("previous_bolt"); // this is wrong change it to
                                            // shuffleGrouping

所有分组:在所有bolt任务中复制流。小心使用此分组。

答案 3 :(得分:0)

您需要指定消费者群组。一旦指定,Kafka将只向您的任何一个喷口发送下一条消息。所有的鲸鱼都应该属于同一个消费群体。

创建消费者时,请指定以下属性

props.put(" group.id",a_groupId);

答案 4 :(得分:0)

如果你的kafka喷口是Opeque,那么你需要拓扑.max.spout.pending< 10 因为"待定意味着元组尚未被激活或失败"所以,如果每个批次没有更多的元组,并且少于待处理的数量,则喷口试图达到最大喷口待定尺寸。

如果您的需求满足,可以使用Transactional Spout处理此问题。