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

Apache kafka 如何将消息发送到Kafka中的特定分区?,apache-kafka,apache-zookeeper,kafka-producer-api,Apache Kafka,Apache Zookeeper,Kafka Producer Api,我创建了一个有许多分区的主题。我希望使用控制台生产者将消息发送到特定分区,并通过控制台使用者查看。 在游戏机制作人身上我试过这个 kafka-console-producer.bat --broker-list localhost:9092 --topic sample --property parse.key=true --property key.separator=, 将消息发送为 key1,another-message 但我只是对key1是否表示分区号感到困惑 我使用consol

我创建了一个有许多分区的主题。我希望使用控制台生产者将消息发送到特定分区,并通过控制台使用者查看。 在游戏机制作人身上我试过这个

kafka-console-producer.bat --broker-list localhost:9092 --topic sample  --property parse.key=true --property key.separator=,
将消息发送为

key1,another-message
但我只是对key1是否表示分区号感到困惑

我使用console consumer查看了这些消息

kafka-console-consumer.bat --zookeeper localhost:2181 --topic sample

我想根据分区查看消息。这是在控制台使用者上查看消息的正确方式吗?任何人都可以清楚地理解这一点吗?

密钥不是分区号,但Kafka使用密钥指定目标分区。默认策略是基于密钥的散列选择分区,或者如果密钥为null,则使用循环算法

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


更新:您还可以在

中直接指定分区号。注意,如果您使用的不是console producer,而是Kafka producer客户端(如官方Java producer客户端),则实际上可以直接指定消息应发送到的目标分区。控制台生成器很适合在生产环境中使用,但通常不用于生产环境。可以通过编程实现自定义分区的可能重复,可以找到一个示例。您不能使用kafka console Producer指定它,但此示例是一个Java代码,您在Scala中有相同的代码吗?是的,使用
ProducerRecord创建一个ProducerRecord(Java.lang.String主题,Java.lang.Integer分区,K键,V值)创建要发送到指定主题和分区的记录
Producer使用密钥哈希将消息分发到分区。例如,您可以有两个分区,整数键和算法将偶数键分配给第一个分区,奇数键分配给第二个分区。至于分区号,当您向Kafka发送消息时,您使用ProducerRecord对象。使用此对象可以显式指定分区号。Kafka中的键不是唯一的。因此,如果您有3条具有相同密钥的消息,则所有3条消息都将写入卡夫卡。他们的身体是相同还是不同并不重要。如果您有基于键的分区算法,那么所有3条消息都将转到同一分区。