【问题标题】:Kafka Consumer Rebalancing AlgorithmKafka消费者再平衡算法
【发布时间】:2015-04-18 21:21:23
【问题描述】:

谁能告诉我 Kafka 消费者的再平衡算法是什么?我想了解分区计数和消费者线程对此有何影响。

谢谢,

【问题讨论】:

  • Kafka Consumer Rebalancing 的可能重复项
  • @ChrisForrence 感谢您的输入,但这并没有详细介绍我正在寻找的算法,因为目前在 Kafka 0.8 中我们看到了一些奇怪的行为,我需要了解该算法正确解释这一点。
  • 您应该将该信息添加到您的问题中,然后;)This 可能会有所帮助

标签: apache-kafka kafka-consumer-api


【解决方案1】:

好的,目前有 2 种再平衡算法 - RangeRoundRobin。它们也称为分区分配策略。

为简单起见,假设我们有一个主题 T1 有 10 个分区,并且我们还有 2 个具有不同配置的消费者(为了让示例更清楚) - C1num.streams 设置为 1 和 @987654327 @ 与 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) 对于组内的每个消费者实例,订阅的主题集都是相同的(我们这里有一个主题,所以现在这不是问题)。

当这两个条件得到验证时,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-1T1-4 转到 C2-0
T1-7 转到 C2-1
再说一遍:
T1-6 转到 C1-0
T1-9 转到 C1-1

此时,所有主题分区都已分配,每个消费者线程都有几乎相等数量的分区。

希望这会有所帮助。

【讨论】:

  • 如果消费者线程多于分区会发生什么?
  • @Kousha 那么一些消费者线程将处于空闲状态并且不会获得任何分区。
  • 循环法似乎会让搜索每个消费者得到一些数据,但不一定是所有线程。
  • Range 似乎只会填满前几个消费者的线程,可能会让完整的消费者没有任何分区。
  • 感谢您的回答。我不完全明白为什么 RoundRobin 有两个限制,请您多解释一下吗?
【解决方案2】:

你可以阅读这篇关于消费者注册算法和消费者再平衡算法的 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)

还要注意:

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

【讨论】:

    猜你喜欢
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2015-01-26
    • 1970-01-01
    • 2017-06-19
    相关资源
    最近更新 更多