我有一个有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
2条答案
按热度按时间fgw7neuy1#
是的,默认的分区器将创建冲突,最晚当您比分区多了一个键时,会发生冲突。请看@senseiwu的答案,它很好地解释了发生了什么。如果您有一组有限的密钥,并且希望将它们分布在相同数量的分区上,那么您必须实现自己的分区器。
kq0g1dla2#
kafka的defaultpartitioner在生产者客户端使用杂音哈希算法为每条消息分配一个分区。对于10个分区和一位数的密钥,不能保证它们是均匀分布的。每个消息的分区计算是相互独立的,碰撞概率是一个数学问题。
编辑:
杂音哈希算法不太可能导致冲突。kafka主题中的分区是固定的-它不能像java hashmap实现中的bucket大小那样增长。所以分区算法使用了一个计算分区数模的公式。精确公式是
Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
现在您可以看到,如果hash mod number of partitions
结果相同。对于大量的随机密钥集,密钥将均匀分布在所有分区上。
如果您想排序,那么必须使用分区键。在这种情况下,您对冲突和空分区的担心几乎没有实际影响(好吧,对于一组大的随机键,它们就可以了)。如果您假设kafka会集中确保在将密钥路由到已填充的分区之前先填充空分区,那么事情就不是这样的了