【问题标题】:How to check which partition is a key assign to in kafka?如何检查在kafka中分配给哪个分区的键?
【发布时间】:2018-10-14 07:54:54
【问题描述】:

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

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

【问题讨论】:

    标签: apache-kafka kafka-consumer-api


    【解决方案1】:

    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个分区

    这不是保证。哈希可能会发生冲突。

    说一个给定的键不在多个分区中更有意义。

    如果集群没有重新平衡

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

    【讨论】:

    • 为什么 DefaultPartitioner 不使用一致性哈希?
    • 计算会为同一个key返回同一个分区。听起来对我来说是一致的
    • 我的意思是像en.wikipedia.org/wiki/Consistent_hashing中的一致哈希。与模块化散列相比,这会重新映射更少的键,如果我们的消费者维护与键相关的状态将会很有帮助。
    • 分区器是可覆盖的,我只是回答默认情况。我无法回答为什么选择一种方法而不是另一种方法
    【解决方案2】:

    当您发送消息时, 分区由以下类确定

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2017-01-13
      • 2018-10-08
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多