Kafka - 存储在同一分区中的不同密钥的消息

时间:2016-10-07 09:24:45

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

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

例如:

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")

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

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

1 个答案:

答案 0 :(得分:1)

如果创建主题&#34;动态&#34;,则根据num.partitions参数(默认值1)创建分区数。如果您只有一个分区,则所有数据都将转到此单个分区。

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

如果您希望确保不同的密钥始终转到不同的分区,则需要使用使用者分区程序或直接指定分区号。