【问题标题】:How to send message to a particular partition in Kafka?如何将消息发送到 Kafka 中的特定分区?
【发布时间】:2018-10-23 18:07:58
【问题描述】:

我创建了一个有很多分区的主题。使用控制台生产者我想将消息发送到特定分区并通过控制台消费者查看。 在控制台制作人我试过这个,

kafka-console-producer.bat --broker-list localhost:9092 --topic sample  --property parse.key=true --property key.separator=,

发送消息,

key1,another-message

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

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

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

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

【问题讨论】:

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


【解决方案1】:

key不是分区号而是Kafka用key来指定目标分区。默认策略是根据 key 的 hash 选择分区,如果 key 为 null,则使用循环算法。

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

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

【讨论】:

  • 自定义分区可以通过编程来完成,其中一个例子可以在here找到。你不能用 kafka-console-producer 指定它
  • 但是这个例子是Java代码,你Scala里有吗?
  • 是的,用ProducerRecord(java.lang.String topic, java.lang.Integer partition, K key, V value) Creates a record to be sent to a specified topic and partition创建一个ProducerRecord
  • 生产者使用密钥的哈希值将消息分发到分区。例如,您可以有两个分区,整数键和算法将偶数键分配到第一个分区,奇数键分配到第二个分区。至于分区号,当您将消息发送到 Kafka 时,您使用 ProducerRecord 对象。使用此对象,您可以明确指定分区号。
  • Kafka 中的键不是唯一的。因此,如果您有 3 条具有相同密钥的消息,则所有 3 条消息都将写入 Kafka。它们是否具有相同或不同的身体并不重要。如果你有基于 key 的分区算法,所有 3 条消息都会去同一个分区。
猜你喜欢
  • 1970-01-01
  • 2019-02-04
  • 2020-01-27
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
相关资源
最近更新 更多