kcat学习
date
Feb 4, 2024
slug
kcat-cli
status
Published
tags
tool
summary
type
Post
简介
kcat
edenhill • Updated Apr 17, 2024
brew install kcat
之后,直接输入kcat
就能看到帮助手册。常用指令
首先是
-C | -P | -L | -Q Mode: Consume, Produce, Metadata List, Query mode
C
消费模式 (Consume Mode): 在此模式下,kafkacat将从指定的主题和分区中读取并打印消息。这对于查看和调试生产到Kafka的数据非常有用。
P
生产模式 (Produce Mode): 在此模式下,kafkacat从标准输入(stdin)读取,把每行作为一个消息发送到指定的Kafka主题中。
L
元数据列表模式 (Metadata List Mode): 此模式会打印出有关Kafka集群的元数据,包括可用的broker, 主题, 分区等。
Q
查询模式 (Query Mode): 这是一个新的模式, 用于查询和打印指定主题和分区的低/高水位标记,以及消费者组的偏移量。
这是kcat的四种使用模式,一般来说我们前两种用得比较多,分别是模拟一个consumer和producer。
L
在我们需要了解kafka元信息的时候会使用,Q
是比较高阶的用法,在复杂查询的时候会用到。-L 元信息
复习一下kafka的构成:
- Brokers: Broker是Kafka集群中的一个服务器节点,用于处理生产者和消费者的请求,并且保存和发送消息。每个broker都有一个唯一的ID。简单来说就是一个数据的中转站。
- Topics: 主题是Kafka的数据记录(消息)的类别或者分组。生产者将记录发布到特定的主题,消费者订阅并读取感兴趣的主题的记录。
- Partitions: 每个主题可以分为多个分区,每个分区是一个有序的、不可变的记录队列。新的记录总是被追加到分区的尾部。每个分区在多个broker上都有备份。
- Offsets: 偏移量是每个分区中每条记录的唯一标识。偏移量是一个长整数,在每个分区内唯一,由Kafka自动分配。消费者读取记录时,会跟踪每个分区读取到哪个偏移量,以便下次从停止的地方继续读取。
- Consumer Groups: 消费者组包含一个或多个消费者,可以订阅一个或多个主题。Kafka通过消费者组平衡负载——即,同一个消费者组里的消费者可以分别读取不同分区的数据,但同一分区的数据只能被组内的一个消费者读取。
组件之间的关系类似于上面的结构,但是从brokers开始,每个元数据都是可以有1…n个的,这取决于用户的配置。
上面的组件与之对应的命令有:
- -t <topic> Topic to consume from, produce to, or list
- -p <partition> Partition
- -b <brokers,..> Bootstrap broker(s) (host[:port])
示例
kafkacat -L -b localhost:9092
输出:
可以用
-t
查询出topic
的信息,例如:kcat -L -b localhost:9092 -t mytopic
-C 消费者
-C是消费者模式,也是我们平时会用得比较多的模式。
kcat -C -b localhost:9092 -t mytopic -p 0 -c 10
这条消息会查询出topic为mytopic、分区为0的前十条消息,-c是cnt的缩写。
如果想查询后十条消息呢?使用
-o -10
即可,o是offset的缩写。注意-c和-o的区别。
- -c表示应该消费消息的数量
- -o表示消息的偏移量
两者搭配可以精确的控制消费何时的消息,以及消费的数量。
一般我们kafka消息是json的结构,jq是一个轻量级的命令行JSON处理器,我们可以很方便的组合它们来进行消息展示。
kcat -C -b localhost:9092 -t mytopic -o -3 -e | jq
-e表示当读取到最后一条消息就会退出,不会持续监听。
-e Exit successfully when last message received
上面的命令是获取所有分区的最后三条消息,然后使用jq进行格式化,可能的输出结果是:
我们也可以使用
-J
来达到同样的效果:-J Output with JSON envelope
-P 生产者
尽量不要在生产环境中使用-P发送消息,可能会导致严重的后果。
下面是使用例子:
echo "Hello, Kafka" | kcat -P -b localhost:9092 -t test_topic
通过管道发送消息
kcat -P -b localhost:9092 -t test_topic -l <filename>
-l表示从文件中读取内容。
-Q query
一般这个模式用的比较少,文档里面写的用法是:
下面是一个示例:
$ kcat -Q -b localhost:9092 -t mytopic:0:1
mytopic [0] offset 33
这表示mytopic的0分区的从1UTC时间开始的最新消息offset是33(有点绕口。。)
我们要去查看具体消息的话还是要用
-C
:kcat -C -b localhost:9092 -t mytopic -p 0 -o beginning -e