Kafka消费者再平衡算法
Kafka Consumer Rebalancing Algorithm
谁能告诉我 Kafka 消费者的再平衡算法是什么?我想了解分区计数和使用者线程对此有何影响。
谢谢,
好的,目前有 2 种再平衡算法 - Range
和 RoundRobin
。它们也称为分区分配策略。
为简单起见,假设我们有一个包含 10 个分区的主题 T1
,并且我们还有 2 个具有不同配置的消费者(为了让示例更清楚)- C1
和 num.streams
设置为 1
和 C2
,num.streams
设置为 2
。
以下是 Range
策略的运作方式:
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
策略的运作方式:
首先,在实际分配之前必须满足两个条件:
a) 每个主题在消费者实例中都有相同数量的流(这就是为什么我在上面提到每个消费者不同数量的线程将不起作用)
b) 一组订阅主题对于组内的每个消费者实例都是相同的(我们这里有一个主题,所以现在这不是问题)。
当这 2 个条件得到验证时,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-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
此时所有主题分区都已分配,每个消费者线程的分区数几乎相等。
希望这对您有所帮助。
你可以阅读这篇关于消费者注册算法和消费者再平衡算法的 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)
还要注意:
If there are more consumers than partitions, some consumers won't get any data at all. During rebalancing, we try to assign partitions to consumers in such a way that reduces the number of broker nodes each consumer has to connect to.
谁能告诉我 Kafka 消费者的再平衡算法是什么?我想了解分区计数和使用者线程对此有何影响。
谢谢,
好的,目前有 2 种再平衡算法 - Range
和 RoundRobin
。它们也称为分区分配策略。
为简单起见,假设我们有一个包含 10 个分区的主题 T1
,并且我们还有 2 个具有不同配置的消费者(为了让示例更清楚)- C1
和 num.streams
设置为 1
和 C2
,num.streams
设置为 2
。
以下是 Range
策略的运作方式:
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
策略的运作方式:
首先,在实际分配之前必须满足两个条件:
a) 每个主题在消费者实例中都有相同数量的流(这就是为什么我在上面提到每个消费者不同数量的线程将不起作用)
b) 一组订阅主题对于组内的每个消费者实例都是相同的(我们这里有一个主题,所以现在这不是问题)。
当这 2 个条件得到验证时,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-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
此时所有主题分区都已分配,每个消费者线程的分区数几乎相等。
希望这对您有所帮助。
你可以阅读这篇关于消费者注册算法和消费者再平衡算法的 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)
还要注意:
If there are more consumers than partitions, some consumers won't get any data at all. During rebalancing, we try to assign partitions to consumers in such a way that reduces the number of broker nodes each consumer has to connect to.