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的分区选择算法的主要内容,如果未能解决你的问题,请参考以下文章

决策树 ID3 算法中选择分区背后的直觉

经典算法之快速选择算法

Key为nulll时Kafka如何选择分区(Partition)

确定性选择算法的递归关系

kafka2.5.0架构硬件选择参考因素

如何为Kafka集群选择合适的Partitions数量