【问题标题】:How to make Kafka distribute the data equally among all partitions with multiple keys?如何使 Kafka 在具有多个键的所有分区之间平均分配数据?
【发布时间】:2021-12-26 15:50:22
【问题描述】:
创建了一个包含 10 个分区的 Kafka 主题,并且生产者使用 12 个不同的键(标记为 key_1、key_2、key_3、...、key_10)生成了多条消息。
据观察,所有消息仅发送到 2 个分区,其中一个分区中的大部分消息,而另一个分区中的其余消息很少。 10 个分区中有 8 个仍然是空的。
如何让Kafka根据key在10个partition中平均分配数据?
【问题讨论】:
标签:
apache-kafka
partition
unique-key
【解决方案1】:
您需要编写自己的分区器类来保证均匀分布。
否则,您发送的密钥的计算哈希值(以分区数为模)可能只会被分成 2 个分区。
【解决方案2】:
由于您有 12 个不同的键和 10 个分区,因此不可能根据键值获得均匀分布。原因很简单:partitioner 是一个函数,而 {f(key1), f(key2), ..., f(key12)} 是 {p1, p2, ..., p8} 的子集,其中某些分区可能没有出现,有些可能出现多次。
您有以下选择:
- 编写自定义分区器,将键 1-10 映射到分区 1-10,键 11、12 映射到分区 1、2。此外,您可以将分区数增加到 12 个而不是 10 个,并重写分区器,以便将每个分区键入自己的分区。
- 从您的消息中删除密钥,以便使用循环算法。但是,具有相同密钥(现在已经消失)的消息可能并且将会进入不同的分区。
- (垃圾一)编写一个分区器,它忽略消息键并将消息放入随机分区,例如以循环方式。
有关如何实现分区器的详细信息,请尝试在 github 上查找 kafka 的默认 org.apache.kafka.clients.producer.internals.DefaultPartitioner。