当前位置: 首页 > 知识库问答 >
问题:

Kafka流localstore分区分配不平衡

蒲德曜
2023-03-14

首先,很抱歉,如果我的术语不准确,我对Kafka很陌生,我已经尽可能多地读过了。我们有一个使用kafkastreams的服务,kafka版本:2.3.1。流应用程序具有一个流拓扑,该流拓扑从“topica”读取,执行转换并发布到另一个主题“topicb”,然后由拓扑的另一个流消费,并使用Ktable(localstore)聚合它。侦听器将ktable更改发布到另一个主题中。

主题有24个分区。我们在不同的机器上有两个该服务的实例,每个实例有4个流线程。问题是,使用本地存储的分区都分配给了同一个实例。因此磁盘使用、重新平衡、性能都很糟糕。

同样让我意想不到的是,如果我检查Kafka broker上的组分配,我会看到:(为了可读性,删除了其他分区)

GROUP                             CONSUMER-ID                                                                                                                         HOST                        CLIENT-ID                                                                                      #PARTITIONS     ASSIGNMENT
fj.TheAggregation.TST.V1.PERF fj.TheAggregation.TST.V1.PERF-6898e899-7722-421a-8841-f8e45b074981-StreamThread-3-consumer-c089baaa-343b-484f-add6-aca12572e2a5 10.11.200.115/10.11.200.115 fj.TheAggregation.TST.V1.PERF-6898e899-7722-421a-8841-f8e45b074981-StreamThread-3-consumer 54              fj.TheAggregationDocument.TST.V1.PERF(4,8,12,16,20)
fj.TheAggregation.TST.V1.PERF fj.TheAggregation.TST.V1.PERF-6898e899-7722-421a-8841-f8e45b074981-StreamThread-2-consumer-f5e2d4e3-feee-4778-8ab8-ec4dd770541a 10.11.200.115/10.11.200.115 fj.TheAggregation.TST.V1.PERF-6898e899-7722-421a-8841-f8e45b074981-StreamThread-2-consumer 54              fj.TheAggregationDocument.TST.V1.PERF(5,9,13,17,21)
fj.TheAggregation.TST.V1.PERF fj.TheAggregation.TST.V1.PERF-0733344b-bd8d-40d6-ad07-4fc93de76cf2-StreamThread-4-consumer-63371f35-118a-44e0-bc9b-d403fb59384d 10.11.200.114/10.11.200.114 fj.TheAggregation.TST.V1.PERF-0733344b-bd8d-40d6-ad07-4fc93de76cf2-StreamThread-4-consumer 54              fj.TheAggregationDocument.TST.V1.PERF(2)
fj.TheAggregation.TST.V1.PERF fj.TheAggregation.TST.V1.PERF-0733344b-bd8d-40d6-ad07-4fc93de76cf2-StreamThread-1-consumer-714f0fee-b001-4b16-8b5b-6ab8935becfd 10.11.200.114/10.11.200.114 fj.TheAggregation.TST.V1.PERF-0733344b-bd8d-40d6-ad07-4fc93de76cf2-StreamThread-1-consumer 54              fj.TheAggregationDocument.TST.V1.PERF(0)
fj.TheAggregation.TST.V1.PERF fj.TheAggregation.TST.V1.PERF-0733344b-bd8d-40d6-ad07-4fc93de76cf2-StreamThread-2-consumer-d14e2e20-9aad-4a20-a295-83621a76b099 10.11.200.114/10.11.200.114 fj.TheAggregation.TST.V1.PERF-0733344b-bd8d-40d6-ad07-4fc93de76cf2-StreamThread-2-consumer 54              fj.TheAggregationDocument.TST.V1.PERF(1)
fj.TheAggregation.TST.V1.PERF fj.TheAggregation.TST.V1.PERF-6898e899-7722-421a-8841-f8e45b074981-StreamThread-4-consumer-14f390d9-f4f4-4e70-8e8d-62a79427c4e6 10.11.200.115/10.11.200.115 fj.TheAggregation.TST.V1.PERF-6898e899-7722-421a-8841-f8e45b074981-StreamThread-4-consumer 54              fj.TheAggregationDocument.TST.V1.PERF(7,11,15,19,23)
fj.TheAggregation.TST.V1.PERF fj.TheAggregation.TST.V1.PERF-6898e899-7722-421a-8841-f8e45b074981-StreamThread-1-consumer-57d2f85b-50f8-4649-8080-bbaaa6ea500f 10.11.200.115/10.11.200.115 fj.TheAggregation.TST.V1.PERF-6898e899-7722-421a-8841-f8e45b074981-StreamThread-1-consumer 54              fj.TheAggregationDocument.TST.V1.PERF(6,10,14,18,22)
fj.TheAggregation.TST.V1.PERF fj.TheAggregation.TST.V1.PERF-0733344b-bd8d-40d6-ad07-4fc93de76cf2-StreamThread-3-consumer-184f3a99-1159-44d7-84c6-e7aa70c484c0 10.11.200.114/10.11.200.114 fj.TheAggregation.TST.V1.PERF-0733344b-bd8d-40d6-ad07-4fc93de76cf2-StreamThread-3-consumer 54              fj.TheAggregationDocument.TST.V1.PERF(3)

因此每个流服务总共分配了54个分区,但它们的分配并不均匀。此外,如果我检查每个实例上的本地存储,我会看到流ktable都在同一个节点中,即使代理声明某些分区被分配给另一个实例。因此代理提供的数据似乎与streamapp状态不匹配。

是否有方法确保GroupLeader平均分配分区?我希望有某种方法来指定或为每个流分配某种“权重”,以便GroupLeader能够在服务实例之间均匀地分配资源密集的流,或者至少不是很不平衡。顺便问一下,有没有一些Kafka用户群推荐问这种事情?谢谢

共有1个答案

浦墨竹
2023-03-14

2.6中对streams assignor有很多改进(https://cwiki.apache.org/confluence/display/kafka/kip-441%3a+smooth+scaling+out+for+kafka+streams),您可以在这里阅读。

我不知道他们是否会解决你的问题,但应该会有帮助。它确实区别对待ktables这样的有状态任务,并且应该更好地加载它们。

如果您不能从2.3.1升级,您可以尝试使用不同的名称。你可能只是得到了不幸的散列。

 类似资料:
  • spring cloud stream如何将多个Kafka分区分配给属于同一消费者组的反应流? 我注意到,如果我使用普通的非反应流侦听器,每个线程将被分配到一个分区,这取决于使用者并发配置。然而,在流(流量输入)的情况下,我没有注意到任何这样的并行行为。似乎只定义了一个流来处理来自所有分区的消息。 我的期望是每个Kafka主题分区都有独立的流,即使在由不同线程备份的同一节点上也是如此。

  • 当我们的kafka主题中有多个分区时,分区重新平衡是一件常见的事情吗? 这并不一定意味着我们的应用程序存在延迟或问题? 我一直看到分区被撤销和重新分配的日志。

  • 我使用的是Kafka流,具有无状态的简单处理器拓扑结构。 我有一个主题,有100个分区,有2台机器,每台机器有50个线程,运行同一个流媒体应用程序,因此最终我将在它们之间进行1-1映射。 主题中的消息已是键控消息。 我有一个逻辑约束,一旦线程连接到一个或多个分区,它应该继续处理这些分区(当然,直到重新启动发生,它会重新洗牌) 我从日志中看到线程反复(重新)加入消费者组。 我的问题,kafka 流

  • 我有一个Kafka流媒体应用程序,它订阅了许多主题,每个主题都有许多分区。当我创建应用程序拓扑并启动它时,我是否知道哪些主题的哪些分区分配给我的应用程序的当前实例?我想知道这个独立于任何记录是否由这个实例处理。 我知道当我得到一条记录时,我可以做和获取正在处理的当前记录的分区/主题信息。但我不是在找那个。 我正在寻找一个等效的在kafka流侧。 我也尝试了以下代码,但我得到大小s为0。

  • 本文向大家介绍Kafka分区分配的概念?相关面试题,主要包含被问及Kafka分区分配的概念?时的应答技巧和注意事项,需要的朋友参考一下 一个topic多个分区,一个消费者组多个消费者,故需要将分区分配个消费者(roundrobin、range)  

  • 我对再平衡有些怀疑。现在,我正在手动将分区分配给使用者。因此,根据文件,如果消费者离开/崩溃在一个消费群体中,就不会有再平衡。 假设同一组中有3个分区和3个使用者,每个分区都是手动分配给每个使用者的。一段时间后,第三个消费者倒下了。既然没有再平衡,我可以采取什么措施来确保停机时间最小化?我是否需要更改前两个分区中任何一个的配置,以从第三个分区或其他分区开始使用?