提问者:小点点

为什么当源主题分区更改时,kafka流线程会死亡?有人能指向周围的阅读材料吗?


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

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

我看到这个链接-https://issues.apache.org/jira/browse/KAFKA-6063?jql=project=KAFKA AND组件=流AND文本~"分区"

找不到原因

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

基本上,这背后的原因如果条件。


共2个答案

匿名用户

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

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

另请注意,Kafka Streams假设输入数据按键分区。如果更改进审量主题分区,基于哈希的分区也会更改可能导致不正确输出的内容。

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

匿名用户

如果有状态客户端因此失败,请删除更改日志主题和本地状态存储。

相关问题