如何向Kafka指定分区发送消息并按分区查看?
关于Kafka控制台生产者/消费者的分区相关问题解答
首先明确:你用的key1不是分区编号
你当前的生产者命令里,key1是消息的业务Key,Kafka默认会对这个Key做哈希运算,再对主题的分区数取模,以此决定这条消息发送到哪个分区。简单说,相同的Key会被路由到同一个分区(除非主题分区数变化),但Key本身并不是直接指定分区号。
如果想直接指定分区发送消息,可以修改生产者命令,加上--property partition=目标分区号参数,比如要发送到分区1:
kafka-console-producer.bat --broker-list localhost:9092 --topic sample --property partition=1
你的消费者命令有两个问题
- 使用了过时的ZooKeeper连接方式:Kafka 0.10.2版本之后,消费者已不再推荐通过ZooKeeper(
--zookeeper)连接,而是直接通过Broker的--bootstrap-server参数连接,这种方式更稳定且功能更完善。 - 无法按分区查看消息:原命令只会消费所有分区的消息,但不会区分消息来源分区,也无法指定只消费某个分区。
按分区查看消息的正确命令
方式1:只消费指定分区的消息
如果你想单独查看某个分区的所有消息(包括历史消息),可以用--partition指定分区,加上--from-beginning从头开始消费:
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic sample --partition 0 --from-beginning
把0换成你要查看的分区编号即可。
方式2:消费所有分区,并显示每条消息的分区信息
如果想同时消费所有分区,且看到每条消息来自哪个分区,可以加上print.partition=true参数,还可以同时显示消息Key(和你生产者的发送格式对应):
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic sample --from-beginning --property print.partition=true --property print.key=true --property key.separator=,
执行后,你会看到类似这样的输出:
[Partition 0][key1] another-message
清晰展示了消息所在的分区、Key和内容。
内容的提问来源于stack exchange,提问作者Jayz
相关产品推荐
相关产品推荐

