卡夫卡本地状态存储/变更日志中的保留时间

时间:2019-02-14 07:41:12

标签: apache-kafka apache-kafka-streams

我将Kafka和Kafka Streams用作Spring Cloud Stream的一部分。我的Kafka Streams应用程序中流动的数据通过某些时间窗口进行汇总和实现:

Materialized<String, ErrorScore, WindowStore<Bytes, byte[]>> oneHour = Materialized.as("one-hour-store");
    oneHour.withLoggingEnabled(topicConfig);
    events
            .map(getStringSensorMeasurementKeyValueKeyValueMapper())
            .groupByKey()
            .windowedBy(TimeWindows.of(oneHourStore.getTimeUnit()))
            .reduce((aggValue, newValue) -> getMaxErrorScore(aggValue, newValue),
                    (oneHour));

按照设计,正在实现的信息也将由changelog主题提供支持。

我们的应用程序还具有一个休息端点,它将像这样查询状态存储:

 ReadOnlyWindowStore<String, Double> windowStore =  queryableStoreRegistry.getQueryableStoreType("one-hour-store", QueryableStoreTypes.windowStore());
 WindowStoreIterator<ErrorScore> iter = windowStore.fetch(key, from, to);

查看创建的changelog主题的设置,内容为:

min.insync.replicas 1
cleanup.policy delete
retention.ms 5259600000
retention.bytes -1

我认为本地状态存储至少会将信息保存61天(〜2个月)。但是,似乎只有大约最后一天的数据保留在商店中。

是什么原因导致这么快的数据被删除?

更新解决方案 Kafka Streams 2.0.1版不包含Materialized.withRetention方法。对于此特定版本,我可以使用以下代码来设置状态存储的保留时间,该代码可以解决我的问题:

TimeWindows timeWindows = TimeWindows.of(windowSizeMs);
    timeWindows.until(retentionMs);

使我的代码编写为:

...

.groupByKey()
        .windowedBy(timeWindows)
        .reduce((aggValue, newValue) -> getMaxErrorScore(aggValue, newValue),
                (oneHour));
...

1 个答案:

答案 0 :(得分:0)

对于窗口KTable,存在本地保留时间,并且存在changlog保留时间。您可以通过Materialized.withRetentionTime(...)设置本地商店的保留时间-默认值为24h。

  

对于较旧的Kafka版本,通过Windows#until()设置了本地商店保留时间。

如果创建了新应用程序,则会以与本地商店保留时间相同的保留时间来创建变更日志主题。但是,如果您手动增加日志保留时间,这不会影响您的商店保留时间,但是您需要相应地更新代码。当changelog主题已存在时也是如此:如果更改本地存储保留时间,则changelog主题配置不会自动更新。

为此也有一个Jira:https://issues.apache.org/jira/browse/KAFKA-7591