我有一个包含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
答案 0 :(得分:1)
是的,默认的分区程序将创建冲突,并且最晚在您拥有一个比分区多的键时发生。看到@senseiwu的答案,很好地解释了会发生什么。 如果您有一组有限的键,并且想要将它们分布在相同数量的分区上,则必须实现自己的分区程序。
答案 1 :(得分:0)
Kafka的DefaultPartitioner在生产者客户端使用murmur哈希算法为每个消息分配一个分区。无法保证对于10个分区和单个位数的键,它们将均匀分布。每个消息的分区计算是相互独立的,发生冲突的可能性是数学上的兴趣。
编辑:
杂音哈希算法不太可能导致冲突。 Kafka主题中的分区是固定的-它不能像Java HashMap实现中的存储桶大小那样增长。因此,分区算法使用一个公式来计算分区数的模。确切公式为Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
现在您可以看到,如果hash mod number of partitions
产生相同的值,则两个不同的哈希值确实可以产生相同的分区号。
对于大量的随机密钥集,密钥将均匀地分布在所有分区上。