我想在两个时间戳之间计算给定的卡夫卡主题中的信息数量。我尝试使用kafkacat执行此操作,使用以下命令:
# START_DATE = 01.04.2022 02:00:00Z
# END_DATE = 01.04.2022 02:05:00Z
$ kafkacat -C -b broker:9092 -t mytopic -o s@1648778400000 -o e@1648778700000 -p 0 -f '[ts %T] [partition %p] [offset %o] %k\n' -e -c 1实际上,这是在very similar question中列出的相同的方法。
根据kafkacat --help
Consumer options:
-o <offset> Offset to start consuming from:
beginning | end | stored |
<value> (absolute offset) |
-<value> (relative offset from end)
s@<value> (timestamp in ms to start at)
e@<value> (timestamp in ms to stop at (not included))相应地,我希望上面的命令给我第一个时间戳大于s@<value>,小于e@<value>的记录。但是,它反而给出了一个在s@<value>之前具有时间戳的记录(实际上,它只是给了分区0中的第一条记录):
# output of above command
[ts 1648692486141] [partition 0] [offset 2] 643b0013-b3e1-47a5-a9d3-7478c0e91ca4我是否误解了消费者选择s@<value>和e@<value>
Kafkacat版本:
Version 1.5.0 (JSON, librdkafka 1.2.1 builtin.features=gzip,snappy,ssl,sasl,regex,lz4,sasl_gssapi,sasl_plain,sasl_scram,plugins,sasl_oauthbearer)此外,我看到了一些奇怪的行为,即使只有s@<value>。例如:
kafkacat -C -b broker:9092 -t mytopic -o s@1648778400000 -p 0 -f '[ts %T] [partition %p] [offset %o] %k\n' -e -c 1据我理解,应该用record.timestamp ≥ 1648778400000输出第一条记录。实际产出不同:
[ts 1648692486141] [partition 0] [offset 2] 643b0013-b3e1-47a5-a9d3-7478c0e91ca4并在我设置的时间戳之前包含一个时间戳(31.03.2022 02:08:06Z和01.04.2022 02:00:00Z)。
当我使用docker run edenhill/kcat:1.7.1进行测试时,这个输出是相同的(上面是一个Ubuntu kafkacat)
发布于 2022-09-26 13:16:48
我不认为你能多次提供-o。因此,您的选择包括
-o e@1648778700000 -p 0 -c 1从分区0读取一条消息,该分区小于时间戳1648778700000
若要正确地在时间戳之间使用,请查找开始时间戳的偏移量,将其提交给使用者组,然后使用结束时间戳启动组中的使用者。
https://stackoverflow.com/questions/73853753
复制相似问题