2015-02-18 49 views
12

有人可以告诉我什么重新平衡算法是卡夫卡消费者?我想了解分区计数和消费者线程如何影响这一点。卡夫卡消费者重新平衡算法

谢谢

+0

[卡夫卡消费再平衡(http://stackoverflow.com/questions/27181693/kafka-consumer-rebalancing) – 2015-02-18 00:53:31

+2

@ChrisForrence谢谢你的输入,但可能重复,不包括在算法我正在寻找的细节,与目前使用Kafka 0.8的情况一样,我们看到一些奇怪的行为,并且我需要理解算法以正确解释这一点。 – NSA 2015-02-18 01:12:49

+0

您应该将该信息添加到您的问题中,然后;)[This](http://stackoverflow.com/q/26757733/899126)可能会有所帮助 – 2015-02-18 01:16:02

回答

23

好了,所以有2种再平衡算法的时刻 - RangeRoundRobin。它们也被称为分区分配策略。

对于简单起见假设我们有一个主题T1 10个分区和我们也有2名消费者提供不同的配置(对于例如更清晰) - C1num.streams设置为1C2num.streams设置为2

以下是如何将与Range战略合作:

范围勾画出字母排序数字顺序和消费者线程可用分区。所以在我们的例子中,分区的顺序是0, 1, 2, 3, 4, 5, 6, 7, 8, 9,消费者线程的顺序是C1-0, C2-0, C2-1。然后,分区的数量除以消费者线程的数量,以确定每个消费者线程应拥有多少个分区。在我们的例子中,它不会平分,所以线程C1-0将会得到一个额外的分区。最终分区分配是这样的:

C1-0获得分区0, 1, 2, 3
C2-0获得分区4, 5, 6
C2-1获得分区7, 8, 9

如果将有11个分区为这些消费者会改一下分区分配:

C1-0会得到分区0, 1, 2, 3
C2-0会得到分区4, 5, 6, 7
C2-1会得到分区8, 9, 10

就是这样。

相同的配置不会为RoundRobin战略工作,因为它需要跨认购了该主题的所有消费者平等num.streams,所以让我们假设这两个消费者num.streams设置为2了。与Range战略相比,其中一个主要区别在于,您无法预测重新平衡之前的任务。以下是如何将与RoundRobin战略合作:

首先,有2个条件,必须实际分配之前应满足:

a)每个主题有相同数量的消费者实例内流的(这就是为什么我提到以上,每个消费者的线程数量不同)
b)订阅主题集合对于组内的每个消费者实例是相同的(我们在这里有一个主题,所以现在不存在问题)。

当验证这两个条件时,topic-partition对通过散列码进行排序,以减少将一个主题的所有分区分配给一个使用者(如果有多个主题需要使用)的可能性。

最后,所有topic-partition对以循环方式分配给可用的使用者线程。例如,如果我们的话题 - 分区将结束排序是这样的:T1-5, T1-3, T1-0, T1-8, T1-2, T1-1, T1-4, T1-7, T1-6, T1-9和消费者线程C1-0, C1-1, C2-0, C2-1然后分配将是这样的:

T1-5C1-0
T1-3C1-1
T1-0C2-0
T1-8C2-1
在这一点上没有剩下的消费者线程,但还有更多的主题分区,所以重复消费者线程开始:
T1-2C1-0
T1-1C1-1
T1-4C2-0
T1-7C2-1
又说:
T1-6C1-0
T1-9C1-1

此时所有话题间壁ons被分配并且每个消费者线程每个具有几乎相同数量的分区。

希望这会有所帮助。

+0

如果消耗线程数多于分区,会发生什么情况? – Kousha 2015-04-30 19:34:49

+1

@Kousha然后一些消费者线程将被闲置一个将不会得到任何分区。 – serejja 2015-04-30 19:50:01

+0

似乎循环法会让搜索每个消费者获得一些数据,但不一定是所有线程。 – Kousha 2015-04-30 19:56:21

0

正如它说你可以阅读本卡夫卡文档http://kafka.apache.org/documentation/#impl_brokerregistration关于消费者登记算法和消费的再平衡算法

,每个消费者不会再平衡过程如下:

1. For each topic T that C<sub>i</sub> subscribes to 
2. let P<sub>T</sub> be all partitions producing topic T 
3. let C<sub>G</sub> be all consumers in the same group as C<sub>i</sub> that consume topic T 
4. sort P<sub>T</sub> (so partitions on the same broker are clustered together) 
5. sort C<sub>G</sub> 
6. let i be the index position of C<sub>i</sub> in C<sub>G</sub> and let N = size(P<sub>T</sub>)/size(C<sub>G</sub>) 
7. assign partitions from i*N to (i+1)*N - 1 to consumer C<sub>i</sub> 
8. remove current entries owned by C<sub>i</sub> from the partition owner registry 
9. add newly assigned partitions to the partition owner registry 
    (we may need to re-try this until the original partition owner releases its ownership) 

而且还注意的是:

如果消费者多于分区,则有些消费者根本无法获得任何数据。在重新平衡期间,我们尝试以减少每个消费者必须连接的代理节点数量的方式将消费分配给消费者。