回答
好了,所以有2种再平衡算法的时刻 - Range
和RoundRobin
。它们也被称为分区分配策略。
对于简单起见假设我们有一个主题T1
10个分区和我们也有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
对通过散列码进行排序,以减少将一个主题的所有分区分配给一个使用者(如果有多个主题需要使用)的可能性。
最后,所有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
此时所有话题间壁ons被分配并且每个消费者线程每个具有几乎相同数量的分区。
希望这会有所帮助。
正如它说你可以阅读本卡夫卡文档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)
而且还注意的是:
如果消费者多于分区,则有些消费者根本无法获得任何数据。在重新平衡期间,我们尝试以减少每个消费者必须连接的代理节点数量的方式将消费分配给消费者。
- 1. 卡夫卡消费者重新平衡条件
- 2. 消费者重新平衡期间的卡夫卡消息订购
- 3. 卡夫卡gruop消费者
- 4. 卡夫卡消费者不消费
- 5. 卡夫卡10.2新消费者与旧消费者
- 6. 无法创建卡夫卡消费者
- 7. 卡夫卡消费者/生产者API
- 8. 卡夫卡消费品(集团)触发重新平衡的条件
- 9. 消费消费使用卡夫卡消费者 - Java
- 10. 卡夫卡消费者调查和重新连接
- 11. 如何从生产者消费卡夫卡的消费者?
- 12. 复位消费者在卡夫卡0.10
- 13. Spark Streaming中的卡夫卡消费者
- 14. 卡夫卡消费者同步行为
- 15. 问题在消费者卡夫卡
- 16. 暂停高级卡夫卡消费者
- 17. 卡夫卡消费者不是从
- 18. 卡夫卡消费者行为
- 19. 关闭卡夫卡消费者
- 20. 卡夫卡消费者行为
- 21. 春季集成卡夫卡消费者
- 22. 如何暂停卡夫卡消费者?
- 23. 卡夫卡消费者 - Java客户端
- 24. 卡夫卡消费者与JAVA
- 25. 卡夫卡0.90消费者坚持
- 26. 云中的卡夫卡消费者
- 27. 卡夫卡kafka.common.MessageSizeTooLargeException在消费者
- 28. 卡夫卡消费者滞后JMX
- 29. 卡夫卡:消费者崩溃
- 30. 卡夫卡消费者查询
[卡夫卡消费再平衡(http://stackoverflow.com/questions/27181693/kafka-consumer-rebalancing) – 2015-02-18 00:53:31
@ChrisForrence谢谢你的输入,但可能重复,不包括在算法我正在寻找的细节,与目前使用Kafka 0.8的情况一样,我们看到一些奇怪的行为,并且我需要理解算法以正确解释这一点。 – NSA 2015-02-18 01:12:49
您应该将该信息添加到您的问题中,然后;)[This](http://stackoverflow.com/q/26757733/899126)可能会有所帮助 – 2015-02-18 01:16:02