为什么根据时间戳获取topic的offset为空呢

浩客2年前技术文章858

一、前言

最近有一个需求,要查询某一时间戳对应的offset值,于是就想到了使用 ./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --time <timestamp> ,但是我在测试的时候,发现有的时间戳会获取不到offset,是空。但是明明指定的时间戳有上报数据,肯定有对应的 offset 的。

11111111.png

2222222222.png


二、解惑

./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list message-1:9092 -topic test --time 后面的参数可以是 -1、-2、时间戳,其中 -1 会输出最新的 offset ;-2 会输出未过期最小的 offset ;时间戳这里具有迷惑性,它不能根据时间戳获取到精准匹配的 offset 。

Kafka 将数据存储在 “log segments” 里面,log segments 文件的大小受 log.segment.bytes 影响,默认为 1073741824 字节,也就是 1G 。当数据文件累积到 log.segment.bytes 的值以后,就会创建出新的日志文件,文件名称以分段时的那个 offset 命名,如下图所示:

3333.png


每一个 xxx.log 文件都算作一个 segment,kafka.tools.GetOffsetShell --time 参数匹配的是 xxx.log 文件本身最后的修改时间,而不是偏移量本身的时间戳。

根据上面图片,举几个例子:

  • 当 time 为 2020-09-16 11:59:20 时,获取的 offset 值为空。

  • 当 time 大于等于 2020-09-16 12:00:20 并且 time 小于 2020-09-16 14:09:24 时,获取的 offset 值为 0,匹配的是 xxx.log 文件名称的那个 offset 。

  • 当 time 大于等于 2020-09-16 14:09:24 时,获取的 offset 值为 1049942,匹配的是 xxx.log 文件名称的那个 offset 。

  • 当 time 远大于 2020-09-16 14:09:24 时,获取的 offset 值为最新的 offset 值。

根据以上实践结果得知,一组时间戳均对应着同一个 offset 。所以这个命令 --time <timestamp> 只能匹配个大概的 offset 而已,无法精确。


相关文章

kafka安全认证与授权

kafka安全认证与授权一、SASL、SSL、ACL介绍1.SASL鉴权协议,主要用来保证客户端登录服务器的时候,传输的鉴权数据的安全性,SASL是对用户名和密码加解密用的 2.SSL是一种间于传输层...

Hive优化之监控(四)

Hive优化之监控(四)

    Hive是大数据领域常用的组件之一,主要是大数据离线数仓的运算,关于Hive的性能调优在日常工作和面试中是经常涉及的一个点,因此掌握一些Hive调优是必...

高效便捷!解锁阿里云跨账号专线互联的全新实施方案

高效便捷!解锁阿里云跨账号专线互联的全新实施方案

01背    景为持续提升金融云环境的合规标准以及可用区内产品服务的性能和稳定性,阿里云将对杭州地域BCD三个金融云可用区进行基础设施架构升级与改造,对应可用区云产品将于 2024...

数据湖技术之iceberg(七)Spark管理iceberg表

数据湖技术之iceberg(七)Spark管理iceberg表

1.SparkSQL设置catalog配置以下操作主要是SparkSQL操作Iceberg,同样Spark中支持两种Catalog的设置:hive和hadoop,Hive Catalog就是icebe...

flume性能调优

1.Source性能调优1.1 Spooldir Source使用Spooldir Source采集日志数据时,若每行日志数据<100bp,可以通过将多行合并传输来提升传输性能建议合并时根据数据...

Prometheus监控Minio集群

Prometheus监控Minio集群

一、概述Minio支持集成prometheus,用以监控CPU、硬盘、网络等数据。二、修改docker-compose.yaml官方的给docker-compose.yaml,默认是不能访问metri...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。