重新启动应用程序后,为什么我的Kafka Streams应用程序的使用者组(应用程序ID)的偏移量会重置?

时间:2019-01-11 11:05:32

标签: apache-kafka apache-kafka-streams

我有一个Kafka Streams应用程序,每当我重新启动它时,它所消耗的主题的偏移都将重置。因此,对于所有分区,延迟都会增加,应用程序需要重新处理所有数据。

更新: 输出主题接收到一系列事件,这些事件在App重新启动后已经得到处理,而不是输入主题偏移已重置,就像我在上一段中所说的那样。但是,内部主题( KTABLE-SUPPRESS-STATE-STORE )偏移量已重置,请参阅下面的注释。

我确保重新启动之前每个分区的滞后时间都是1(这是针对输出主题的)。 属于该消费者组ID(app-id)的所有消费者均处于活动状态。 立即重启,大约需要30秒。

该应用程序仅使用一次作为处理保证。

我已阅读此答案How does an offset expire for an Apache Kafka consumer group?

我尝试使用 auto.offset.reset =最新 auto.offset.reset =最早

似乎这些主题的偏移量未得到有效落实(但我对此不确定)。

我认为重启后,该应用应该从该消费者组的最新提交偏移量中提取。

更新: 我认为这是针对内部主题( KTABLE-SUPPRESS-STATE-STORE

Kafka Stream API是否确保在关闭之前提交所有消耗的偏移量? (在调用 streams.close()之后)

我真的很感谢有关此的任何线索。

更新

这是应用执行的代码:

final StreamsBuilder builder = new StreamsBuilder();
final KStream<..., ...> events = builder
        .stream(inputTopicNames, Consumed.with(..., ...)
        .withTimestampExtractor(...);

events
    .filter((k, v) -> ...)
    .flatMapValues(v -> ...)
    .flatMapValues(v -> ...)
    .selectKey((k, v) -> v)
    .groupByKey(Grouped.with(..., ...))
    .windowedBy(
        TimeWindows.of(Duration.ofSeconds(windowSizeInSecs))              
            .advanceBy(Duration.ofSeconds(windowSizeInSecs))
            .grace(Duration.ofSeconds(windowSizeGraceInSecs)))
    .reduce((agg, new) -> {
        ...
        return agg;
    })
    .suppress(Suppressed.untilWindowCloses(
                  Suppressed.BufferConfig.unbounded()))
    .toStream()
    .to(outPutTopicNameOfGroupedData, Produced.with(..., ...));

通过Kafka Stream API创建的 KTABLE-SUPPRESS-STATE-STORE 内部主题,将始终(在重启后)进行偏移重置。

我尝试过一次至少一次一次“处理保证”。

再一次,我将非常感谢有关此的任何线索。

3 个答案:

答案 0 :(得分:1)

  

通过Kafka Stream API创建的KTABLE-SUPPRESS-STATE-STORE内部主题始终(在重新启动之后)进行偏移重置。

这是当前(2.1版)的预期行为,因为suppress()运算符仅在内存中工作。因此,在重新启动时,必须先从changelog主题重新创建抑制缓冲区,然后才能开始处理。

请注意,计划在未来的发行版中让suppress()写入磁盘(参见https://issues.apache.org/jira/browse/KAFKA-7224)。这样可以避免从changelog主题重新创建缓冲区的开销。

答案 1 :(得分:0)

我认为@Matthias J. Sax的回复涵盖了压抑的大部分内部因素。不过,我需要澄清一件事:当您说“重新启动应用程序”时,您到底做了什么?您是否已正常关闭整个应用程序,然后重新启动它?

答案 2 :(得分:-2)

提交频率由参数commit.interval.ms控制。检查您的抵消额是否确实存在。默认情况下,偏移量每100毫秒或30秒提交一次,具体取决于您的处理保证配置。签出this