默认的Kafka分区程序创建哈希键冲突

时间:2019-05-31 19:26:15

标签: hash apache-kafka key partitioner

我有一个包含10个分区的主题,并且已经使用A,B,C,D,E,F,G,H,I 9个不同的键生成了事件。

我观察到了这样做的消息:

Partition 0- (Message1, Key E), (Message2, Key I)
Partition 1- (Message3, Key F) 
. 
. 
Partition7-(Message4, Key A), (Message5, Key A)
Partition8- Empty 
Partition9- Empty

在同一分区中有2条消息具有不同的键,并且也有空的分区。

Kafka的默认partitioner是否发生碰撞?

我正在从一个流平衡到两个默认余量producers来生产。

这是我所期望的:

 Partition 0- (Message1, Key E)
 Partition 1- (Message3, Key F) 
 . 
 . 
 Partition7-(Message4, Key A), (Message5, Key A)
 Partition8-(Message2, Key I) 
 Partition9- Empty

2 个答案:

答案 0 :(得分:1)

是的,默认的分区程序将创建冲突,并且最晚在您拥有一个比分区多的键时发生。看到@senseiwu的答案,很好地解释了会发生什么。 如果您有一组有限的键,并且想要将它们分布在相同数量的分区上,则必须实现自己的分区程序。

答案 1 :(得分:0)

Kafka的DefaultPartitioner在生产者客户端使用murmur哈希算法为每个消息分配一个分区。无法保证对于10个分区和单个位数的键,它们将均匀分布。每个消息的分区计算是相互独立的,发生冲突的可能性是数学上的兴趣。

编辑:

杂音哈希算法不太可能导致冲突。 Kafka主题中的分区是固定的-它不能像Java HashMap实现中的存储桶大小那样增长。因此,分区算法使用一个公式来计算分区数的模。确切公式为Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;

现在您可以看到,如果hash mod number of partitions产生相同的值,则两个不同的哈希值确实可以产生相同的分区号。

对于大量的随机密钥集,密钥将均匀地分布在所有分区上。