在本文中使用的 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条信息:
参考: