默认的kafka分区器创建哈希键冲突

q7solyqu  于 2021-06-06  发布在  Kafka
关注(0)|答案(2)|浏览(508)

我有一个有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

在同一分区中有两条具有不同密钥的消息,并且也有空分区。
Kafka的默认分区器是否正在创建冲突?
我是从一个流平衡到两个默认rest生产者生产。
这正是我所期待的:

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

fgw7neuy1#

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

kq0g1dla

kq0g1dla2#

kafka的defaultpartitioner在生产者客户端使用杂音哈希算法为每条消息分配一个分区。对于10个分区和一位数的密钥,不能保证它们是均匀分布的。每个消息的分区计算是相互独立的,碰撞概率是一个数学问题。
编辑:
杂音哈希算法不太可能导致冲突。kafka主题中的分区是固定的-它不能像java hashmap实现中的bucket大小那样增长。所以分区算法使用了一个计算分区数模的公式。精确公式是 Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions; 现在您可以看到,如果 hash mod number of partitions 结果相同。
对于大量的随机密钥集,密钥将均匀分布在所有分区上。
如果您想排序,那么必须使用分区键。在这种情况下,您对冲突和空分区的担心几乎没有实际影响(好吧,对于一组大的随机键,它们就可以了)。如果您假设kafka会集中确保在将密钥路由到已填充的分区之前先填充空分区,那么事情就不是这样的了

相关问题