首页 > 解决方案 > Kafka 中使用了哪些内部主题?

问题描述

我们正在使用 kafka 流 api 进行聚合,其中我们也使用 group by。我们还使用状态存储来保存输入主题数据。

我注意到的是

Kafka 内部创建了 3 种主题

  1. Changelog-<storeid>-<partition>
  2. Repartition-<storeid>-<partition>
  3. <topicname>-<partition>

我无法理解的是

  1. 为什么当我拥有所有数据时它会创建更改日志主题<topic>-<partition>
  2. 重新分区主题是否包含分组后的数据。
  3. 我看到 Changelog 和 topicname-parition 的大小大致相同。

数据有什么不同,因此必须为此保存不同的文件。

标签: apache-kafkaapache-kafka-streams

解决方案


'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 页面


推荐阅读