我使用Kafka作为源,使用Storm构建了一个示例拓扑。这是我需要解决的问题。
每次我杀死一个拓扑并重新启动它时,该拓扑都会从头开始处理。
假设主题X中的消息A经过拓扑处理,然后我杀死了拓扑。
现在,当我再次提交拓扑并且消息A仍然存在主题X时,将再次对其进行处理。
是否有解决方案,也许是某种偏移管理来处理这种情况。
答案 0 :(得分:1)
在创建spoutconfig时,请确保它具有固定的spout id,以便在重启后可以用来标识自己。
从Storm官方网站上
重要提示:重新部署拓扑时,请确保设置 SpoutConfig.zkRoot和SpoutConfig.id未被修改,否则 壶嘴将无法读取其先前的消费状态 ZooKeeper的信息(即偏移量)-可能会导致 意外的行为和/或数据丢失,具体取决于您的用例。
答案 1 :(得分:1)
您不应该对新代码使用storm-kafka
,因为在Kafka中不推荐使用底层客户端API,并且从2.0.0版本开始将其删除,因此不推荐使用。而是使用storm-kafka-client
。
要使用storm-kafka-client
来设置组ID和第一个轮询偏移策略。
KafkaSpoutConfig.builder(bootstrapServers, "your-topic")
.setProp(ConsumerConfig.GROUP_ID_CONFIG, "kafkaSpoutTestGroup")
.setFirstPollOffsetStrategy(UNCOMMITTED_EARLIEST)
.build();
以上内容将使您的喷口在您首次启动时从最早的偏移开始,然后如果您重新启动,它将从中断的位置开始。 Kafka使用组ID来在重新启动喷口时识别喷口,因此它可以找回存储的偏移检查点。其他补偿策略的行为会有所不同,您可以在Javadoc中检查FirstPollOffsetStrategy枚举。
喷口将检查它定期到达的距离,配置中还有一个设置可以控制它。检查点由配置中的setProcessingGuarantee
设置控制,可以设置为至少一次(仅检查点确认偏移量),最多一次(spout发出消息之前的检查点)和“任何时候”(定期检查点,不理会袜子)。