如果我在风暴拓扑中增加Kafka喷口的并行度,如何阻止它多次在主题中读取相同的消息?
答案 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处理此问题。