【问题标题】:Kafka - Message with different key stored in same partitionKafka - 具有不同密钥的消息存储在同一分区中
【发布时间】:2016-10-08 03:10:22
【问题描述】:

我正在尝试将具有不同密钥的消息存储到不同的分区。

例如:

ProducerRecord<String, String> rec1 = new ProducerRecord<String, String>("topic", "key1", line);
ProducerRecord<String, String> rec2 = new ProducerRecord<String, String>("topic", "key2", line);
producer.send(rec1);
producer.send(rec2);

但是当我尝试运行我的 Producer 类时,它总是存储在单个分区中。

根据文档,DefaultPartitioner 使用 message key hash code 来查找分区。 我也看到了这个问题Kafka partition key not working properly‏,但是我在 0.9.x 版本的 Kafka 客户端库中找不到ByteArrayPartitioner 类。

props.put("partitioner.class", "kafka.producer.ByteArrayPartitioner")

更新:我正在使用代码动态创建主题。

如果我手动创建一个带有分区的主题,那么它工作正常。

【问题讨论】:

    标签: apache-kafka partitioning kafka-producer-api


    【解决方案1】:

    如果主题是“动态”创建的,则会根据num.partitions 参数(默认值1)使用分区数创建主题。如果你只有一个分区,所有的数据都会到这个分区。

    但是,请记住,即使您有多个分区,一个分区仍然可以分配不同的键!即使您有 num-partitions == num-distinct-keys 也可能存在哈希冲突,将两个不同的键分配给相同的分区(并使某些分区为空)。

    如果你想确保不同的key总是去不同的partition,你需要使用consumer partitioner或者直接指定partition number。

    【讨论】:

    • 非常感谢您的回答。
    猜你喜欢
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2021-09-16
    相关资源
    最近更新 更多