Kafka 使用了哪些内部主题?

Abh*_*hek 3 apache-kafka apache-kafka-streams

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

我注意到的是

Kafka内部创建了3种topic

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

我无法理解的是

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

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

mju*_*rez 5

内部 Kafka 主题有几种类型:

  • __consumer_offsets用于存储每个主题/分区的偏移量提交。
  • __transaction_state用于使用事务语义为 Kafka 生产者和消费者保留状态。
  • _schemas模式注册表使用它来存储所有模式、元数据和兼容性配置。
  • 以下三个主题是 Kafka Streams 使用的内部主题的示例。前两个是常规的 join 信息,第三个实际上是 RocksDB 持久化 StateStore:
    • {consumer-group}--KSTREAM-JOINOTHER-0000000005-store-changelog
    • {consumer-group}--KSTREAM-JOINTHIS-0000000004-store-changelog
    • {consumer-group}--incompleteMessageStore-changelog

这里有更多信息:


aru*_*elu 5

'Changelog' 和 'repartition' 内部 Kafka 主题特定于 Kafka Streams。

来自卡夫卡维基,

Kafka Streams 允许有状态的流处理,即具有内部状态的操作符。这种内部状态在所谓的状态存储中进行管理。状态存储可以是短暂的(失败时丢失)或容错的(失败后恢复)。Kafka Streams DSL 使用的默认实现是一种容错状态存储,使用 1. 内部创建和压缩的变更日志主题(用于容错)和 2. 一个(或多个)RocksDB 实例(用于缓存的键值查找)。因此,在启动/停止应用程序和倒带/重新处理的情况下,需要正确管理这些内部数据。

当流上有加入/聚合操作时,会创建变更日志主题。实际上,聚合调用的结果会创建一个状态存储,并且为了容错,状态存储由 Kafka Changelog 主题备份。

聚合结果存储在这个内部主题中。当应用程序重新启动且 application-id 未更改时,状态将从更改日志主题中恢复。

当流上有关键修改操作时,会创建重新分区主题。例如 groupByKey() 操作创建重新分区主题。查看JIRA 页面以了解有关自动创建重新分区主题的更多信息。

这两个内部主题使 Kafka 流具有容错的有状态流处理能力。

重新分区主题是否包含分组后的数据?- 是的

Changelog 和 topicname-parition 的大小大致相同- 可能所有聚合操作的结果都存储在此主题中。

有关更多详细信息,请查看Kafka Wiki 页面