Kafka主题保留和对Kafka流中的State store的影响

时间:2019-12-02 13:16:27

标签: apache-kafka apache-kafka-streams

我在Kafka流字计数应用程序中有一个状态存储库(使用Materialized.as())。
根据我的理解,状态存储在Kafka内部主题中维护。


以下问题是:

  1. 状态存储可以具有无限的键值对吗? 由基于log.retention的kafka主题规则控制 政策还是log.segment.bytes?
  2. 我将log.retention.ms = 60000设置为 期望状态存储值在一分钟后重置为0。但我发现 没有发生,我仍然可以从状态存储中看到值。卡夫卡彻底清除了原木还是保持 SNAPSHOT以防万一日志压缩主题?
  3. “分段已落实”是什么意思?

请提供解决方案的来源(如果有)。

2 个答案:

答案 0 :(得分:2)

  

状态存储区可以有无限制的键/值对吗?还是由基于log.retention策略或log.segment.bytes的kafka主题规则控制?

是的,状态存储可以具有无限的键值对=事件(或“消息”)。好吧,当然,Kafka中的本地应用程序存储空间和远程存储空间允许(后者用于将数据持久存储在状态存储中)。

您的应用程序的状态存储在压缩的内部Kafka主题中远程保留。压缩意味着Kafka会定期从存储中清除同一事件密钥的旧事件(例如Bob的旧帐户余额)。但紧凑的主题不会删除每个事件键的最新事件(例如,鲍勃的当前帐户余额)。压缩主题中将存储多少个“唯一”键值对没有上限。

  

我将log.retention.ms = 60000设置为,并希望状态存储值在一分钟后会重置为0。但是我发现这没有发生,我仍然可以从状态存储中看到值。

将主题配置为压缩(log.retention.ms)时不使用

log.cleanup.policy=compact。有关详细信息,请参见现有的SO问题Log compaction to keep exactly one message per key,包括为何不立即进行压缩的原因(总之,这是因为压缩对分区段文件进行操作,不会接触最新的段文件,并且可能有多个事件该文件中的每个事件键)。

注意:现在,您可以将配置log.cleanup.policy设置为压缩和基于时间/卷的保留与log.cleanup.policy=compact,delete的组合(有关详细信息,请参见KIP-71)。但是,除非您真的知道自己在做什么,否则通常不要摆弄此设置-默认值是99%的时间需要的设置。

  

kafka是否完全清除了日志或保留了SNAPSHOT,以防出现日志压缩主题? “段已落实”是什么意思?

不幸的是,我不明白这个问题。 :-)也许我以前的答案和参考链接已经满足您的需求。我能说的是,不,Kafka不会完全清除日志。压缩对主题分区的段文件进行操作。您可能需要阅读压缩的工作原理,如果Apache Kafka文档还不够清楚,我建议您参考https://medium.com/@sunny_81705/kafka-log-retention-and-cleanup-policies-c8d9cb7e09f8之类的文章。

答案 1 :(得分:0)

状态存储由紧凑的内部主题维护。因此,它们遵循压缩主题的相同语义,并且必须保留有限的时间

https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Streams+Internal+Data+Management