kafka工具的奇怪行为:kafka.tools.GetOffsetShell

时间:2015-05-04 12:36:59

标签: apache-kafka kafka-consumer-api

我想使用时间戳获取偏移量,并尝试使用kafka.tools.GetOffsetShell命令工具。该文件是:https://cwiki.apache.org/confluence/display/KAFKA/System+Tools

我认为此命令会在我们指定的时间戳之前返回最新的N个偏移量。但我尝试了几个命令而感到困惑......

kafka-run-class.sh kafka.tools.GetOffsetShell \
  --broker-list ka1:9092 \
  --time -1 \
  --topic test_topic \
  --offsets 100 \
  --partitions 61

返回:

test_topic:61:6269917760,6257457002

然后:

 kafka-run-class.sh kafka.tools.GetOffsetShell \
   --broker-list ka1:9092 \
   --time -2 \
   --topic test_topic \
   --offsets 100 \
   --partitions 61

返回:

test_topic:61:6257457002

然后:

kafka-run-class.sh kafka.tools.GetOffsetShell \
   --broker-list ka1:9092 \
   --time 1430742921000 \
   --topic test_topic \
   --offsets 100 \
   --partitions 61

返回空集!!!

test_topic:61:

这个工具如何运作?

1 个答案:

答案 0 :(得分:1)

Kafka将其日志存储在“日志段”中。这些在config:

中设置
# The maximum size of a log segment file. When this size is reached a new log segment will be created.
log.segment.bytes=1073741824

kafka.tools.GetOffsetShell匹配日志段的时间戳,而不是自己的偏移量的时间戳。

因此,每个日志段的大小都为1073.74兆字节(默认值)。因此,如果您的历史记录中的消息总共超过3,222兆字节,那么您将能够通过时间戳查询4个不同的日志段。

这就是为什么:

kafka-run-class.sh kafka.tools.GetOffsetShell \
  --broker-list ka1:9092 \
  --time 1430742921000 \
  --topic test_topic \
  --offsets 100 \
  --partitions 61

你回来了:

test_topic:61:

当您在时间轴上查询时间戳时,在任何日志段之前,因为工具将日志段的上次修改日期与提供的时间戳匹配。

通过创建测量日志文件大小并在创建每个新日志后查询时间戳的测试,我发现了这一点。