hash - 默认的 Kafka 分区器创建哈希键冲突
问题描述
我有一个包含 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的默认分区器是否会产生冲突?
我从一个平衡到两个默认休息生产者的流进行生产。
这是我所期待的:
Partition 0- (Message1, Key E)
Partition 1- (Message3, Key F)
.
.
Partition7-(Message4, Key A), (Message5, Key A)
Partition8-(Message2, Key I)
Partition9- Empty
解决方案
Kafka 的 DefaultPartitioner在生产者客户端使用杂音散列算法为每条消息分配一个分区。不能保证对于 10 个分区和个位数的键,它们会均匀分布。每个消息的分区计算是相互独立的,碰撞概率是一个数学兴趣。
编辑:
杂音散列算法不太可能导致冲突。Kafka 主题中的分区是固定的 - 它不会像 java HashMap 实现中的桶大小一样增长。因此,分区算法使用计算分区数模的公式。确切的公式是Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
现在您可以看到,如果两个不同的键产生hash mod number of partitions
相同的值,则确实可以产生相同的分区号。
对于大量随机密钥集,密钥将均匀分布在所有分区中。
如果您想订购,那么您必须使用分区键..在这种情况下,您对冲突和空分区的担忧几乎没有实际影响(好吧,对于大量随机键,它们会没问题)。如果您假设 Kafka 会集中确保在将密钥路由到已填充的分区之前先填充空分区,那么事情就不是这样了
推荐阅读
- python - Python POST 字符串数据
- python - 即使我没有给出气流的上游或下游,任务也会出现
- excel - 使用 groovy 脚本比较两个肥皂响应
- android - 在 Android 应用冷启动时,阻止网络请求,直到 VPN 启动
- javascript - 为什么 Vue `@click="click"` 和 `@click="click()"` 的工作方式相同?
- javascript - 用于输入错误地址并使用 javascript 或 jQuery 限制用户的正则表达式
- html - 如何不仅从 python CGI 脚本打开 HTML 文件,还将字符串和 JSON 文件等数据传递给 HTML 脚本?
- mfc - 基于 mfc 对话框的应用程序中的功能区控件
- java - 如何杀死当前类创建的所有线程
- python - 逗号分隔的字符串用python excel单元格