【问题标题】:strange behavior of kafka tool : kafka.tools.GetOffsetShellkafka 工具的奇怪行为:kafka.tools.GetOffsetShell
【发布时间】:2017-11-16 10:09:16
【问题描述】:

我想使用时间戳获取偏移量,并尝试使用 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:

这个工具是如何工作的?

【问题讨论】:

  • 您的问题解决了吗?我得到了同样的行为并深入了解它。
  • 可能是因为GetOffsetShell无法根据插入时间戳得到准确的偏移量。你可以看一下源码,kafka 将数据存储到多个块中,它首先根据时间戳找到块,然后返回该块中的第一条记录。所以如果你的块很大,比如你只有一个块,它会返回这个块的第一条记录....

标签: apache-kafka kafka-consumer-api


【解决方案1】:

Kafka 将其日志存储在“日志段”中。这些是在配置中设置的:

# 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:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-21
    • 2018-07-26
    • 2016-02-10
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多