java - 为什么 kafka 流线程会在源主题分区更改时死亡?谁能指出这方面的阅读 Material ?

标签 java apache-kafka apache-kafka-streams

由于消息的吞吐量很高,我们增加了分区的数量以并行处理消息。一旦我们增加了分区的数量,所有订阅该主题的流线程就会死亡。我们更改了消费者组 ID,然后重新启动了它运行良好的应用程序。

我知道应用程序更改日志主题的分区数应该与源主题相同。我想知道这背后的原因。

我看到了这个链接 - https://issues.apache.org/jira/browse/KAFKA-6063?jql=project%20%3D%20KAFKA%20AND%20component%20%3D%20streams%20AND%20text%20~%20%22partition%22

找不到原因

https://github.com/apache/kafka/blob/fdc742b1ade420682911b3e336ae04827639cc04/streams/src/main/java/org/apache/kafka/streams/processor/internals/InternalTopicManager.java#L122

基本上,这个 if 条件背后的原因。

最佳答案

输入主题分区定义并行级别,如果您有聚合或连接等有状态操作,则这些操作的状态在分片中。如果你有 X 个输入主题分区,你会得到 X 个任务,每个任务都有一个状态分片。此外,状态由 Kafka 中具有 X 个分区的更新日志主题支持,并且每个分片都只使用其中一个分区。

如果您将输入主题分区的数量更改为 X+1,Kafka Streams 会尝试使用 X 个存储分片创建 X+1 个任务,但是现有的变更日志主题只有 X 个分区。因此,应用程序的整个分区中断,Kafka Streams 无法保证正确处理,因此会因错误而关闭。

另请注意,Kafka Streams 假定输入数据是按键分区的。如果您更改输入主题分区的数量,基于散列的分区也会更改,这也可能导致不正确的输出。

一般情况下,建议一开始就过度划分主题以避免这个问题。如果您确实需要横向扩展,最好使用新的分区数创建一个新主题,并并行启动应用程序的副本(使用新的应用程序 ID)。之后,您更新上游生产者应用程序以写入新主题,最后关闭旧应用程序。

关于java - 为什么 kafka 流线程会在源主题分区更改时死亡?谁能指出这方面的阅读 Material ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54650298/

相关文章:

java - SSL SSLv2 客户端问候 - 握手失败

java - 从服务线程更新 JavaFX GUI

java - 如何测量每个输入文件的 Xtend 翻译时间

apache-kafka - I/O 中的 Kafka 错误 java.io.EOFException : null

java - 使用自定义键创建 KTable 时出错

scala - KTable 应该发出的事件

java - 如何使用标点符号从状态存储中删除旧记录? (卡夫卡)

java - 适用于 Linux 的 Windows 子系统无法识别 JAVA_HOME 环境变量

java - 卡夫卡 0.8.2 消费者

java - 自定义 Java 生产者中的 Kafka SSL 握手失败