kcat学习

date
Feb 4, 2024
slug
kcat-cli
status
Published
tags
tool
summary
type
Post

简介

kcat
edenhillUpdated Apr 17, 2024
kafkacat是一个开源的命令行工具,用于与Apache Kafka进行交互。使用 kafkacat, 你可以生产、消费和查看Kafka中的消息,而无需写代码。这对于调试或者测试非常有用。
brew install kcat之后,直接输入kcat 就能看到帮助手册。

常用指令

首先是
-C | -P | -L | -Q Mode: Consume, Produce, Metadata List, Query mode
  1. C 消费模式 (Consume Mode): 在此模式下,kafkacat将从指定的主题和分区中读取并打印消息。这对于查看和调试生产到Kafka的数据非常有用。
  1. P 生产模式 (Produce Mode): 在此模式下,kafkacat从标准输入(stdin)读取,把每行作为一个消息发送到指定的Kafka主题中。
  1. L 元数据列表模式 (Metadata List Mode): 此模式会打印出有关Kafka集群的元数据,包括可用的broker, 主题, 分区等。
  1. Q 查询模式 (Query Mode): 这是一个新的模式, 用于查询和打印指定主题和分区的低/高水位标记,以及消费者组的偏移量。
这是kcat的四种使用模式,一般来说我们前两种用得比较多,分别是模拟一个consumer和producer。L在我们需要了解kafka元信息的时候会使用,Q 是比较高阶的用法,在复杂查询的时候会用到。

-L 元信息

复习一下kafka的构成:
  1. Brokers: Broker是Kafka集群中的一个服务器节点,用于处理生产者和消费者的请求,并且保存和发送消息。每个broker都有一个唯一的ID。简单来说就是一个数据的中转站。
  1. Topics: 主题是Kafka的数据记录(消息)的类别或者分组。生产者将记录发布到特定的主题,消费者订阅并读取感兴趣的主题的记录。
  1. Partitions: 每个主题可以分为多个分区,每个分区是一个有序的、不可变的记录队列。新的记录总是被追加到分区的尾部。每个分区在多个broker上都有备份。
  1. Offsets: 偏移量是每个分区中每条记录的唯一标识。偏移量是一个长整数,在每个分区内唯一,由Kafka自动分配。消费者读取记录时,会跟踪每个分区读取到哪个偏移量,以便下次从停止的地方继续读取。
  1. 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
     

    © hhmy 2019 - 2024