如何将Kafka状态重置为“宇宙起点”?

时间:2018-04-03 15:43:51

标签: apache-kafka-streams

我还在研究我所描述的Kafka Streams应用程序 Why isn't Kafka consumer producing results?。在那篇帖子中,我问为什么要设置

kstreams_props.put( ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
在将任何数据推送到任何主题之前,

似乎没有将Kafka的状态重置为“Universe的开始”。我现在遇到了该问题的变体:

我的应用程序包括一个将数据推送到Kafka流的生产者程序和一个消费者程序,它将数据分组,聚合这些组,然后将生成的KTable转换回我打印出来的流。

聚合步骤实质上是将所有值相加,然后将这些总和作为新数据放入输出流中。但我观察到的是,每次运行程序时,生成的聚合值都会变得越来越大,就像Kafka以某种方式保留以前的结果并包括聚合中的结果一样。

为了尝试修复此问题,我删除了所有我的主题(Kafka不允许的__consumer_offsets除外),然后重新运行我的应用程序,但聚合值继续增长,好像Kafka保留了先前计算的结果,即使我认为删除中间主题会解决问题。我甚至尝试停止并重新启动Kafka服务器,但无济于事。

这里发生了什么,更重要的是,我该如何解决这个问题?我已尝试过有关设置AUTO_OFFSET_RESET_CONFIG的各种建议,但也没有效果。我应该提到我的应用程序的一个方面是我的原始生产者在Producer.send调用中创建了自己的Kafka时间戳,虽然禁用它似乎也没有效果。

提前致谢 - 马克

1 个答案:

答案 0 :(得分:2)

this.props.children仅在没有提交的偏移量时触发:如果应用程序启动,它首先查找已提交的偏移量并仅应用重置策略,如果没有有效的偏移量。

此外,对于Kafka Streams应用程序,重置偏移量是不够的,您应该使用重置工具AUTO_OFFSET_RESET_CONFIG - 此博客文章详细解释了该工具:https://www.confluent.io/blog/data-reprocessing-with-kafka-streams-resetting-a-streams-application/