带有Kafka偏移量管理的Apache Storm

时间:2019-03-26 05:52:14

标签: apache-kafka apache-storm

我使用Kafka作为源,使用Storm构建了一个示例拓扑。这是我需要解决的问题。

每次我杀死一个拓扑并重新启动它时,该拓扑都会从头开始处理。

假设主题X中的消息A经过拓扑处理,然后我杀死了拓扑。

现在,当我再次提交拓扑并且消息A仍然存在主题X时,将再次对其进行处理。

是否有解决方案,也许是某种偏移管理来处理这种情况。

2 个答案:

答案 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发出消息之前的检查点)和“任何时候”(定期检查点,不理会袜子)。

看看Storm https://github.com/apache/storm/blob/dc56e32f3dcdd9396a827a85029d60ed97474786/examples/storm-kafka-client-examples/src/main/java/org/apache/storm/kafka/spout/KafkaSpoutTopologyMainNamedTopics.java#L93附带的示例拓扑之一。