Mah*_*yan 5 apache-kafka kafka-producer-api
我是卡夫卡的新手,所以我有一些与卡夫卡基本事物相关的问题。我想将所有消息平均分配到所有分区。
据我所知,Producer 使用默认的Partitioner哈希算法(随机、一致、Murmur2、粘性等)根据密钥哈希(如果密钥可用)选择分区。这太棒了。但我想将消息分发到所有分区。喜欢:
主题:“测试”
分区:3
现在,如果我生成消息(可用密钥),那么我想平等地分发这些消息,如下所示:
分区 1:1,4,7,10
分区 2:2,5,8
分区 3:3,6,9
那么,我怎样才能将消息平均分配到所有分区
如果键可用且记录本身未指定分区,则默认分区器会根据键的哈希值选择分区。否则(即不存在键且未指定分区),它将以循环方式选择分区(Kafka<2.4,请阅读下文)。
\npublic int partition(String key, int partitionNum) {\n byte[] keyBytes = key.getBytes();\n return toPositive(murmur2(keyBytes)) % partitionNum;\n}\nRun Code Online (Sandbox Code Playgroud)\n对于少数几个键,使用默认分区程序可能无法为您提供均匀的数据分布,因为toPositive(murmur2(keyBytes)) % numberOfPartitions会发生冲突。最好的方法是让生产者承担责任,并根据您的业务用例决定使用 CustomPartitioner 将消息发送到哪个分区。
\n\n\nKafka 保证给定主题分区的任何消费者将始终按照与写入的顺序完全相同的顺序读取该分区的事件。
\n
这里需要注意的一件事是,尽管消除数据倾斜很重要 - 主题中不同分区中的消息顺序可能是按顺序的,也可能不是按顺序的 - 这可能会根据您的用例产生后果。但在一个分区内它们会按顺序存储,从而将相关消息保留在同一个分区中。
\n例如,在与电子商务交付相关的环境中,与 OrderID 相关的消息应按顺序排列(您不希望“Out-For-Delivery”位于“Delivered”之后),因此特定 order_id 的消息应发送到同一个分区。
\n更新: \n正如评论中提到的,Kafka \xe2\x89\xa5 v2.4 使用 Sticky Partitioner 作为默认分区器。
\n\n\n\n粘性分区器通过选择单个分区来发送所有非键控记录,解决了将没有键控的记录分散为较小批次的问题。一旦该分区上的批次被填满或以其他方式完成,粘性分区程序就会随机选择 \xe2\x80\x9csticks\xe2\x80\x9d 到新分区。这样,在较长的一段时间内,记录大约均匀地分布在所有分区中,同时获得较大批量大小的额外好处。
\n
这意味着 Kafka 生产者不会立即发送记录,而是为没有键且没有分配分区的特定主题保留一批记录,并将发送到同一分区,直到该批次准备好发送为止。创建新批次时,会选择一个新分区。
\n实际上,分区器将记录分配给同一个分区,直到基于batch.size和发送批次linger.ms,一旦发送该批次,将使用新的分区。因此消息不一定是均匀分布的。
进一步阅读:
\nhttps://cwiki.apache.org/confluence/display/KAFKA/KIP-480%3A+Sticky+Partitioner
\n\n\nhttps://aiven.io/blog/balance-data-across-kafka-partitions#challenge-of-uneven-record-distribution
\n| 归档时间: |
|
| 查看次数: |
1881 次 |
| 最近记录: |