有人可以告诉我Kafka消费者的再平衡算法是什么吗?我想了解分区计数和消费者线程如何影响这一点。
谢谢,
答案 0 :(得分:30)
好的,目前有2种重新平衡算法 - Range
和RoundRobin
。它们也被称为分区分配策略。
为简单起见假设我们有一个带有10个分区的主题T1
,我们还有2个具有不同配置的消费者(示例更清晰) - C1
设置为num.streams
1
和C2
num.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
对按哈希码排序,以减少将一个主题的所有分区分配给一个使用者的可能性(如果要使用多个主题)。 / p>
最后,所有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-5
转到C1-0
T1-3
转到C1-1
T1-0
转到C2-0
T1-8
转到C2-1
此时不再有剩余的消费者线程,但仍有更多的主题分区,因此对消费者线程的迭代重新开始:
T1-2
转到C1-0
T1-1
转到C1-1
T1-4
转到C2-0
T1-7
转到C2-1
再说一遍:
T1-6
转到C1-0
T1-9
转到C1-1
此时,所有主题分区都已分配,每个消费者线程的分区数量几乎相等。
希望这有帮助。
答案 1 :(得分:1)
你可以阅读关于消费者注册算法和消费者再平衡算法的这个Kafka文档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)
并注意到:
如果消费者多于分区,则某些消费者根本不会获得任何数据。在重新平衡期间,我们尝试以减少每个消费者必须连接的代理节点数量的方式为消费者分配分区。