我正在尝试将具有不同密钥的邮件存储到不同的分区。
例如:
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")
更新:我正在使用代码动态创建主题。
如果我手动创建一个带分区的主题,那么它的工作正常。
答案 0 :(得分:1)
如果创建主题&#34;动态&#34;,则根据num.partitions
参数(默认值1
)创建分区数。如果您只有一个分区,则所有数据都将转到此单个分区。
但是,请记住,即使您有多个分区,分区仍然可以分配不同的密钥!即使你有num-partitions == num-distinct-keys,也可能存在哈希冲突,为同一个分区分配两个不同的密钥(并将一些分区留空)。
如果您希望确保不同的密钥始终转到不同的分区,则需要使用使用者分区程序或直接指定分区号。