0

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

我观察到这样做的消息:

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的默认分区器是否会产生冲突?

我从一个平衡到两个默认休息生产者的流进行生产。

这是我所期待的:

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

2 回答 2

6

Kafka 的 DefaultPartitioner在生产者客户端使用杂音散列算法为每条消息分配一个分区。不能保证对于 10 个分区和个位数的键,它们会均匀分布。每个消息的分区计算是相互独立的,碰撞概率是一个数学兴趣。

编辑:

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

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

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

如果您想订购,那么您必须使用分区键..在这种情况下,您对冲突和空分区的担忧几乎没有实际影响(好吧,对于大量随机键,它们会没问题)。如果您假设 Kafka 会集中确保在将密钥路由到已填充的分区之前先填充空分区,那么事情就不是这样了

于 2019-05-31T20:02:07.810 回答
1

是的,默认分区程序会产生冲突,最迟当您拥有的密钥比您拥有的分区多一个时才会发生冲突。请参阅@senseiwu 的答案,它很好地解释了发生的事情。如果您有一组有限的键并希望将它们分布在相同数量的分区上,您必须实现自己的分区器。

于 2019-06-03T10:50:56.167 回答