消费者组成员没有分区 [英] Consumer group member has no partition
问题描述
我在同一个消费者组上启动了两个消费者,我订阅了 20 个主题(每个主题只有一个分区)
I launch two consumers on the same consumer group, i subscribe to 20 topics (each has only one partition)
仅在消费者上使用:
kafka-consumer-groups --bootstrap-server XXXXX:9092 --group foo--describe --members --verbose
kafka-consumer-groups --bootstrap-server XXXXX:9092 --group foo --describe --members --verbose
Note: This will not show information about old Zookeeper-based consumers.
CONSUMER-ID HOST CLIENT-ID #PARTITIONS ASSIGNMENT
rdkafka-07cbd673-6a16-4d55-9625-7f0925866540 /xxxxx rdkafka 20 arretsBus(0), capteurMeteo(0), capteurPointMesure(0), chantier(0), coworking(0), horodateur(
0), incident(0), livraison(0), meteo(0), metro(0), parkrelais(0), qair(0), rhdata(0), sensUnique(0), trafic(0), tramway(0), tweets(0), voieRapide(0), zone30(0), zoneRencontre(0)
rdkafka-9a543197-6c97-4213-bd59-cb5a48e4ec15 /xxxx rdkafka 0
我做错了什么?
推荐答案
好的,我阅读了一些有关此类行为的资料,了解为什么会发生这种情况很有趣.Kafka中有两种分区分配策略.
Ok, I did some reading around such behavior, and it's interesting to know why it happens. There are two kinds of partition assignment strategy in Kafka.
范围:
从它订阅的每个主题中为每个消费者分配一个连续的分区子集.因此,如果消费者 C1 和 C2 订阅了两个主题 T1 和 T2,并且每个主题都有三个分区,那么 C1 将被分配来自主题 T1 和 T2 的分区 0 和 1,而 C2 将被分配来自这些主题的分区 2.因为每个主题都有奇数个分区,并且每个主题的分配都是独立完成的,所以第一个消费者最终比第二个消费者拥有更多的分区.每当使用范围分配并且消费者数量没有整齐地划分每个主题中的分区数量时,就会发生这种情况.
循环:从所有订阅的主题中获取所有分区,并按顺序将它们一一分配给消费者.如果之前描述的 C1 和 C2 使用循环分配,则 C1 将具有来自主题 T1 的分区 0 和 2 以及来自主题 T2 的分区 1.C2 将有来自主题 T1 的分区 1 和来自主题 T2 的分区 0 和 2.一般来说,如果所有消费者都订阅了相同的主题(一种非常常见的场景),RoundRobin 分配最终会导致所有消费者拥有相同数量的分区(或最多 1 个分区差异).
默认策略是 Range,这就解释了为什么您会看到这种分区分布.
The default strategy is Range, which explains why you are seeing such partition distribution.
所以,我做了一个小实验.我创建了两个控制台消费者,每个消费者都在听主题 test1, test2, test3, test4
并且每个主题只有一个分区.正如预期的那样,consumer-1 被分配了所有分区.
So, I did a small experiment. I created two console consumers each listening to topics test1, test2, test3, test4
and each topic has only one partition. As expected consumer-1 was assigned all partitions.
然后我将分区策略更改为 org.apache.kafka.clients.consumer.RoundRobinAssignor
并将其传递给控制台消费者,瞧,现在两个消费者都获得了 2 个分区.
Then I changed the partitioning strategy to org.apache.kafka.clients.consumer.RoundRobinAssignor
and passed it to both the console-consumers, and voila, both consumers now gets 2 partitions each.
更新:哎呀没看到几分钟前已经有人回答了.
UPDATE: Oops didn't see it was already answered couple of minutes back.
这篇关于消费者组成员没有分区的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!