Kafka的分区选择算法
Posted
技术标签:
【中文标题】Kafka的分区选择算法【英文标题】:Kafka's partition choosing algorithm 【发布时间】:2017-08-25 02:53:00 【问题描述】:Kafka 使用 math.abs(key.hashCode) % numPartitions 计算要发送的分区。
如果 hashCode 是 Integer.MIN_VALUE 怎么办?
由于 math.abs(Integer.MIN_VALUE) 是负数,kafka 会发送到负分区。这是怎么处理的,我应该关心这个吗?
【问题讨论】:
如你所说,它首先使用math.abs(),那你为什么要担心这种情况呢? 这不是一个坏问题:尝试比在 repl:math.abs(Integer.MIN_VALUE)
打印:res0: Int = -2147483648
相关:***.com/questions/5444611/…
@FredericA。哦,谢谢你的分享!
问题是什么??它应该去math.abs(Int.MaxValue) % numPartitions
partition = 2147483647 % numberOfPartitions
但是你在哪里找到那个代码顺便说一句我看到下面的分区代码Utils.toPositive(nextValue) % availablePartitions.size()
。其中 toPositive 是 number & 0x7fffffff
【参考方案1】:
实际上,当我在 kafka 代码中搜索时,它不会使用 math.abs() 将负数转换为正数。
它使用那个:
public static int toPositive(int number)
return number & 0x7fffffff;
所以它可以解决你担心的问题,即使数字是2147483648,它也会被转换为0
确定性地将数字转换为正值的廉价方法。当输入为 正数,返回原值。当输入数为负数时,返回 正值是原始值位与 0x7fffffff 不是绝对值 价值。
【讨论】:
真的吗?哪个版本? 这是 java kafka 客户端,也在 kafka 代码库中。您可以在github.com/apache/kafka/blob/trunk/clients/src/main/java/org/… 中找到。这不是新功能.. 而defaultPartitioner在github.com/apache/kafka/blob/trunk/clients/src/main/java/org/… 我正在研究旧版本的 scala DefaultPartitioner以上是关于Kafka的分区选择算法的主要内容,如果未能解决你的问题,请参考以下文章