在使用Kafka Streams应用程序时,我们注意到组协调代理将重新平衡元数据存储在__consumer_offsets
主题中。
由于在我们的案例中,我们有1200个流线程,因此该元数据变得非常庞大(约100 MB,无压缩,LZ4压缩后为25 MB),并且由于offsets.load.buffer.size
参数的默认值仅为5MB,因此关注者相应的__consumer_offsets
主题分区的代理无法读取。这导致新的GroupCoordinator在旧的GroupCoordinator发生故障时以error_code=16 (NotCoordinatorException)
进行响应。
为什么经纪人为什么在__consumer_offsets
主题中存储消费者组的重新平衡元数据,并且有一种方法可以禁用此功能?
答案 0 :(得分:1)
出于故障转移的原因而存储组元数据。如果GroupCoordinator死亡,而另一个经纪人接管了这些组,则它需要此数据才能正常工作。这是消费者/经纪人功能,并非仅适用于Kafka Streams。
例如,新的GroupCoordinator必须知道组中有哪些成员才能应用相应的超时(即session.timeout
和max.poll.timeout
)。
因此,无法禁用它,因为这对于群集正常工作至关重要。您可以更改相应的配置设置,以使代理具有足够的内存限制来处理组元数据。
对于普通的KafkaConsumers
组元数据通常不会以如此快的速度增长,处理大型组通常不是问题。但是,KafkaStreams
与客户端相比增加了其他元数据,并且其元数据特别大。这是一个已知问题,我相信以后会解决。