kafka流localstore分区分配不平衡

aiazj4mn  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(398)

首先,对不起,如果我的术语不准确,我对Kafka非常陌生,我已经尽可能多地阅读了。我们有一个使用kafkastreams的服务,kafka版本:2.3.1。流应用程序有一个流拓扑,它读取“topica”,执行转换并发布到另一个主题“topicb”,然后被拓扑的另一个流使用,并使用ktable(localstore)聚合它。侦听器将ktable更改发布到另一个主题中。
主题有24个分区。我们在不同的机器上有两个这个服务的示例,每个示例有4个流线程。问题是,使用本地存储的分区都被分配给同一个示例。因此,磁盘使用、重新平衡和性能都非常糟糕。
如果我检查kafka代理上的组分配,我也会发现一些意想不到的事情:(为了可读性删除了其他分区)

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用户群推荐问这种事情?谢谢

vhmi4jdf

vhmi4jdf1#

在2.6中对streams赋值器有很多改进(https://cwiki.apache.org/confluence/display/kafka/kip-441%3a+smooth+scaling+out+for+kafka+streams)你可以在这里看到他们。
我不知道他们是否能解决你的问题,但应该会有帮助。它对有状态任务的处理方式与ktable不同,应该更好地加载它们。
如果无法从2.3.1升级,可以尝试不同的名称。你可能只是得到了不幸的哈希值。

相关问题