如何检查哪个分区是kafka中的键分配?

时间:2018-05-03 22:15:15

标签: apache-kafka kafka-consumer-api

我正在尝试调试一个问题,我试图证明如果群集没有重新平衡,每个不同的密钥只会转到1个分区。

所以我想知道一个给定的主题,有没有办法确定一个密钥发送到哪个分区?

2 个答案:

答案 0 :(得分:3)

As explained herealso in the source code

您需要byte[] keyBytes假设它不为空,然后使用org.apache.kafka.common.utils.Utils,您可以运行以下命令。

Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;

对于字符串或JSON,它是UTF8编码的,而Utils类有辅助函数来实现它。
对于Avro,例如Confluent序列化值,它有点复杂(一个神奇的字节,然后一个模式ID,然后是数据)。见Wire format

  

只进入1分区

这不是保证。哈希可以碰撞。

说一个给定的密钥不在一个以上的分区中更有意义。

  

如果群集未重新平衡

重新平衡仍将保留分区值。

答案 1 :(得分:0)

发送消息时

分区由以下类确定

https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/internals/DefaultPartitioner.java

如果您想要更改逻辑,请实现org.apache.kafka.clients.producer.Partitioner接口和, 设置ProduceConfig的'partitioner.class'

参考文献: https://kafka.apache.org/documentation/#producerconfigs