apache-kafka - Kafka 中使用了哪些内部主题?
问题描述
我们正在使用 kafka 流 api 进行聚合,其中我们也使用 group by。我们还使用状态存储来保存输入主题数据。
我注意到的是
Kafka 内部创建了 3 种主题
Changelog-<storeid>-<partition>
Repartition-<storeid>-<partition>
<topicname>-<partition>
我无法理解的是
- 为什么当我拥有所有数据时它会创建更改日志主题
<topic>-<partition>
- 重新分区主题是否包含分组后的数据。
- 我看到 Changelog 和 topicname-parition 的大小大致相同。
数据有什么不同,因此必须为此保存不同的文件。
解决方案
'Changelog' 和 'repartition' 内部 Kafka 主题特定于 Kafka Streams。
来自卡夫卡维基,
Kafka Streams 允许有状态的流处理,即具有内部状态的操作符。这种内部状态在所谓的状态存储中进行管理。状态存储可以是临时的(失败时丢失)或容错的(失败后恢复)。Kafka Streams DSL 使用的默认实现是容错状态存储,使用 1. 内部创建和压缩的变更日志主题(用于容错)和 2. 一个(或多个)RocksDB 实例(用于缓存键值查找)。因此,在启动/停止应用程序和倒带/重新处理的情况下,需要正确管理这些内部数据。
当流上有加入/聚合操作时,会创建变更日志主题。实际上,聚合调用的结果创建了一个状态存储,并且为了容错,状态存储由 Kafka Changelog 主题备份。
聚合结果存储在这个内部主题中。当应用程序重新启动且应用程序 ID 未更改时,状态将从更改日志主题中恢复。
当流上有 key 修改操作时,会创建重新分区主题。例如,groupByKey() 操作创建重新分区主题。检查JIRA 页面以了解有关自动创建重新分区主题的更多信息。
这两个内部主题使 Kafka 流具有容错的有状态流处理能力。
重新分区主题是否包含分组后的数据?- 是的
Changelog 和 topicname-parition 的大小大致相同- 可能所有聚合操作的结果都存储在该主题中。
更多详情,请查看Kafka Wiki 页面。