Kafka Topic Retention 和对 Kafka 流中 State store 的影响
Kafka Topic Retention and impact on the State store in Kafka streams
我在 Kafka 流字数统计应用程序中有一个状态存储(使用 Materialized.as()
)。
根据我的理解,state-store 是在 Kafka 内部主题中维护的。
以下问题是:
- 状态存储是否可以有无限的键值对,或者它们是
受基于 log.retention 的 kafka 主题规则的约束
政策或 log.segment.bytes?
- 我设置了 log.retention.ms=60000 和
期望状态存储值在一分钟后重置为 0。但我发现它
没有发生,我仍然可以从状态存储中看到值。 kafka是彻底清除日志还是保留
SNAPSHOT in case log-compaction topic?
- "segment gets committed"是什么意思?
如果可用,请post连同解决方案的来源。
状态存储由紧凑的内部主题维护。因此,它们遵循压缩主题的相同语义,并且必须限制保留期限
https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Streams+Internal+Data+Management
Can state-stores have unlimited key-value pairs, or they are governed by the rules of kafka topics based on the log.retention policies or log.segment.bytes?
是的,状态存储可以有无限的键值对 = 事件(或 'messages')。好吧,Kafka 中的本地应用程序存储 space 和远程存储 space 当然是允许的(后者用于将数据持久存储在您的状态存储中)。
您的应用程序的状态存储远程保存在压缩的内部 Kafka 主题中。压缩意味着 Kafka 定期从存储中清除相同事件键的旧事件(例如,Bob 的旧帐户余额)。但是压缩主题不会删除每个事件键的最新事件(例如,Bob 的当前帐户余额)。压缩主题中将存储多少这样的 'unique' 键值对没有上限。
I set the log.retention.ms=60000 and expected the state store value to be reset to 0 after a minute. But I find that it is not happening, I can still see values from state store.
log.retention.ms
在主题配置为压缩 (log.cleanup.policy=compact
) 时不使用。请参阅现有的 SO 问题 以获取详细信息,包括为什么压缩不会立即发生(简而言之,这是因为压缩操作在分区段文件上,它不会触及最新的段文件,并且可以有多个事件该文件中的每个事件键)。
注意:您现在可以将配置 log.cleanup.policy
设置为压缩和 time/volume-based 保留与 log.cleanup.policy=compact,delete
的组合(有关详细信息,请参阅 KIP-71)。但是通常你不应该 fiddle 使用这个设置,除非你真的知道你在做什么——默认值是你 99% 的时间所需要的。
Does kafka completely wipe out the logs or keeps the SNAPSHOT in case log-compaction topic? What does it mean by "segment gets committed"?
很遗憾,我不明白这个问题。 :-) 也许我之前的回答和参考链接已经满足了您的需求。我能说的是,不,Kafka 并没有完全清除日志。压缩对主题分区的段文件进行操作。您可能需要阅读压缩的工作原理,我建议您阅读 https://medium.com/@sunny_81705/kafka-log-retention-and-cleanup-policies-c8d9cb7e09f8 之类的文章,以防 Apache Kafka 文档不够清晰。
我在 Kafka 流字数统计应用程序中有一个状态存储(使用 Materialized.as()
)。
根据我的理解,state-store 是在 Kafka 内部主题中维护的。
以下问题是:
- 状态存储是否可以有无限的键值对,或者它们是 受基于 log.retention 的 kafka 主题规则的约束 政策或 log.segment.bytes?
- 我设置了 log.retention.ms=60000 和 期望状态存储值在一分钟后重置为 0。但我发现它 没有发生,我仍然可以从状态存储中看到值。 kafka是彻底清除日志还是保留 SNAPSHOT in case log-compaction topic?
- "segment gets committed"是什么意思?
如果可用,请post连同解决方案的来源。
状态存储由紧凑的内部主题维护。因此,它们遵循压缩主题的相同语义,并且必须限制保留期限
https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Streams+Internal+Data+Management
Can state-stores have unlimited key-value pairs, or they are governed by the rules of kafka topics based on the log.retention policies or log.segment.bytes?
是的,状态存储可以有无限的键值对 = 事件(或 'messages')。好吧,Kafka 中的本地应用程序存储 space 和远程存储 space 当然是允许的(后者用于将数据持久存储在您的状态存储中)。
您的应用程序的状态存储远程保存在压缩的内部 Kafka 主题中。压缩意味着 Kafka 定期从存储中清除相同事件键的旧事件(例如,Bob 的旧帐户余额)。但是压缩主题不会删除每个事件键的最新事件(例如,Bob 的当前帐户余额)。压缩主题中将存储多少这样的 'unique' 键值对没有上限。
I set the log.retention.ms=60000 and expected the state store value to be reset to 0 after a minute. But I find that it is not happening, I can still see values from state store.
log.retention.ms
在主题配置为压缩 (log.cleanup.policy=compact
) 时不使用。请参阅现有的 SO 问题
注意:您现在可以将配置 log.cleanup.policy
设置为压缩和 time/volume-based 保留与 log.cleanup.policy=compact,delete
的组合(有关详细信息,请参阅 KIP-71)。但是通常你不应该 fiddle 使用这个设置,除非你真的知道你在做什么——默认值是你 99% 的时间所需要的。
Does kafka completely wipe out the logs or keeps the SNAPSHOT in case log-compaction topic? What does it mean by "segment gets committed"?
很遗憾,我不明白这个问题。 :-) 也许我之前的回答和参考链接已经满足了您的需求。我能说的是,不,Kafka 并没有完全清除日志。压缩对主题分区的段文件进行操作。您可能需要阅读压缩的工作原理,我建议您阅读 https://medium.com/@sunny_81705/kafka-log-retention-and-cleanup-policies-c8d9cb7e09f8 之类的文章,以防 Apache Kafka 文档不够清晰。