如何将消息发送到Kafka中的特定分区?

Amr*_*916 5 apache-kafka kafka-producer-api apache-zookeeper

我创建了一个包含许多分区的主题。使用控制台生产者,我想将消息发送到特定分区并通过控制台使用者查看。在调音台制作人上,我已经尝试过了

kafka-console-producer.bat --broker-list localhost:9092 --topic sample  --property parse.key=true --property key.separator=,
Run Code Online (Sandbox Code Playgroud)

发送消息为,

key1,another-message
Run Code Online (Sandbox Code Playgroud)

但是我只是对key1是否代表分区号感到困惑。

使用控制台使用者,我查看了消息,

kafka-console-consumer.bat --zookeeper localhost:2181 --topic sample
Run Code Online (Sandbox Code Playgroud)

我想根据分区查看消息。这是在控制台使用者上查看消息的正确方法吗?有人可以对此提供清晰的理解吗?

Kat*_*ova 6

密钥不是分区号,而是Kafka使用该密钥指定目标分区。默认策略是根据键的哈希值选择分区,如果键为null,则使用循环算法。

如果需要自定义算法将消息映射到分区,则需要实现org.apache.kafka.clients.producer.Partitioner接口。您的班级名称必须设置为partitioner.class生产者的属性。

更新:您也可以直接在ProducerRecord中指定分区号

  • 自定义分区可以通过编程来完成,示例之一可以在[这里](https://howtoprogram.xyz/2016/06/04/write-apache-kafka-custom-partitioner/)找到。您不能使用 kafka-console-producer 指定它 (3认同)
  • 是的,使用`ProducerRecord(java.lang.String topic,java.lang.Integer partition,K key,V value)创建一个ProducerRecord创建要发送到指定主题和分区的记录。 (2认同)
  • 生产者使用键的哈希值将消息分发到分区。例如,您可以有两个分区,即整数键,并具有将偶数键分配给第一个分区而将奇数键分配给第二个分区的算法。至于分区号,当您将消息发送到Kafka时,可以使用ProducerRecord对象。使用此对象,您可以显式指定分区号。 (2认同)
  • Kafka 中的键不是唯一的。因此,如果有 3 条消息具有相同的密钥,则所有 3 条消息都将写入 Kafka。他们的身体是否相同或不同并不重要。如果你有基于键的分区算法,所有 3 条消息将进入同一个分区。 (2认同)