Kafka 通过指令获取topic最近N条消息

        在本文中使用的 consumer 指令为 kafka-avro-console-consumer,如果你是使用的 kafka-console-consumer,我觉得使用起来是一样的。因为我不记得那个指令怎么用了(懒),所以就没考证,如果有读者,按照我下面的思路,使用 kafka-console-consumer 成功获得了最近N条信息,或者不行,麻烦在评论里回复一下。

1、首先调用 kafka-avro-console-producer往topic里产生消息(可跳过):

./bin/kafka-avro-console-producer --broker-list localhost:9092 --topic testGetN \
	--property "parse.key=true" \
	--property "key.separator=:" \
	--property schema.registry.url="http://localhost:50002" \
	--property key.schema='{"type":"string"}' \
	--property value.schema='{"type":"record","name":"myrecord","fields":[{"name":"m_num","type":"string"}]}'
"keyA":{"m_num": "1"}
"keyA":{"m_num": "2"}
"keyB":{"m_num": "3"}
"keyB":{"m_num": "4"}
"keyC":{"m_num": "5"}
"keyC":{"m_num": "6"}
"keyA":{"m_num": "7"}
"keyA":{"m_num": "8"}
"keyB":{"m_num": "9"}
"keyB":{"m_num": "10"}
"keyC":{"m_num": "11"}
"keyC":{"m_num": "12"}

截图如下:

这时kafka自动创建了名为testGetN的topic,默认分区数量为1。

2、调用 kafka-avro-console-consumer 查看全部消息(可跳过):

./bin/kafka-avro-console-consumer --bootstrap-server localhost:9092 --topic testGetN \
  --property schema.registry.url="http://localhost:50002" \
  --property print.key=true --from-beginning

截图如下:

3、使用 kafka-run-class 指令,获取topic的最大offset和最小offset:

#查看各个分区的最小offset(这个意思就是,这个offset之前的消息已经被清除了,现在consumer是从这个offset之后开始消费):
./bin/kafka-run-class kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic testGetN --time -2
#查看各个分区的最大offset(这个意思就是,producer下一次写入信息时的offset):
./bin/kafka-run-class kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic testGetN --time -1

截图如下:

可以看到分区0里的最小offset为0,最大offset为12,所以topic分区0的信息条数为 12 - 0 = 12条。那么就可以获取最近N条数据,N<=12。

4、比如想要获取最近N=8条数据,offset=12-N=4,所以就从offset为4开始消费,使用指令如下:

./bin/kafka-avro-console-consumer --bootstrap-server localhost:9092 --topic testGetN \
	--property schema.registry.url="http://localhost:50002" \
	--property print.key=true --partition 0 --offset 4

--partition 0 表示指定分区0,--offset 4 表示从4开始消费,结果如下:

成功获取最近8条信息。

以上是topic分区数为1时的情况。

如果topic分区数大于1,比如分区数为3,如下:

可以看到,分区 0,1,2 的最小offset分别为 0,0,0,最大offset分别为 0,4,8。

然后分别查看分区 0,1,2 的数据,如下:

因为整体而言,kafka的信息是无序的,只有在同一个partition里信息才是有序的。

所以如果想要获取全部分区中的最近N条数据,应该是做不到的。

不过可以做到获取各个分区中的最近N条数据,比如获取分区2中的最近5条信息:

 

参考:

Kafka常用命令之kafka-console-consumer.sh

KIP-122: Add Reset Consumer Group Offsets tooling

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值