Kafka - 具有不同密钥的消息存储在同一分区中
Kafka - Message with different key stored in same partition
我正在尝试将具有不同密钥的消息存储到不同的分区。
例如:
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 class 时,它总是存储在单个分区中。
根据文档,DefaultPartitioner
使用 message key hash code
查找分区。
我也看到了这个问题Kafka partition key not working properly,但是我找不到ByteArrayPartitioner
class in 0.9.x version of Kafka Client library.
props.put("partitioner.class", "kafka.producer.ByteArrayPartitioner")
更新:我正在使用代码即时创建主题。
如果我手动创建一个带有分区的主题,那么它工作正常。
如果创建主题 "on the fly",则根据 num.partitions
参数(默认值 1
)创建分区数。如果你只有一个分区,所有数据都将转到这个分区。
但是请记住,即使您有多个分区,一个分区仍然可以分配不同的键!即使您有 num-partitions == num-distinct-keys 也可能存在哈希冲突,将两个不同的键分配给相同的分区(并保留一些分区为空)。
如果你想确保不同的键总是去不同的分区,你需要使用消费者分区器或直接指定分区号。
我正在尝试将具有不同密钥的消息存储到不同的分区。
例如:
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 class 时,它总是存储在单个分区中。
根据文档,DefaultPartitioner
使用 message key hash code
查找分区。
我也看到了这个问题Kafka partition key not working properly,但是我找不到ByteArrayPartitioner
class in 0.9.x version of Kafka Client library.
props.put("partitioner.class", "kafka.producer.ByteArrayPartitioner")
更新:我正在使用代码即时创建主题。
如果我手动创建一个带有分区的主题,那么它工作正常。
如果创建主题 "on the fly",则根据 num.partitions
参数(默认值 1
)创建分区数。如果你只有一个分区,所有数据都将转到这个分区。
但是请记住,即使您有多个分区,一个分区仍然可以分配不同的键!即使您有 num-partitions == num-distinct-keys 也可能存在哈希冲突,将两个不同的键分配给相同的分区(并保留一些分区为空)。
如果你想确保不同的键总是去不同的分区,你需要使用消费者分区器或直接指定分区号。