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

浩客1年前技术文章616

一、前言

最近有一个需求,要查询某一时间戳对应的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 而已,无法精确。


相关文章

MapReduce生产经验

MapReduce程序效率的瓶颈在于两点:1)计算机性能(1)CPU、内存、磁盘、网络2)I/O操作优化(1)数据倾斜(2)Map运行时间太长,导致Reduce等待过久(3)小文件过多下来就根据这两点...

MySQL 复制延迟是如何计算的?

MySQL 复制延迟是如何计算的?

前言日常运维中总会收到 MySQL 备库延迟告警,一般数据库监控只读实例延迟都是采集 Seconds_Behind_Master 值,我们都知道它在某些场景下不可靠,今天一起探索 MySQL 是如何计...

卸载mysql

1、查看安装的mysql,并停止mysqlps -ef|grep mysql #停止mysql  kill -9 pid2、卸载mysql安装包二进制安装的没有安装包 #查看安装的mysql...

kubernetes RBAC

kubernetes RBAC

认证过程,只是确认通信的双方都确认了对方是可信的,可以相互通信。而鉴权是确定请求方有哪些资源的权限。API Server 目前支持以下几种授权策略 (通过 API Server 的启动参数 “–aut...

PG的pathman分区表工具

一、概述在PG<=10的版本中,都是通过表继承的方式进行分区的,必须使用CHECK CONSTRAINT将每个分区创建为子表 。PostgreSQL 10提供了本机分区,它与经典方法没有什么不同...

触发kube-apiserver流控导致ACK集群中节点状态异常

触发kube-apiserver流控导致ACK集群中节点状态异常

问题现象ack集群中一个节点状态为notready,但是排查节点上的核心组件:kubelet、kube-proxy、flannel、etcd等状态均为正常。排查步骤1、查日志分别排查核心组件以及系统日...

发表评论    

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