Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >解惑 | 为什么我根据时间戳获得的offset为空呢?

解惑 | 为什么我根据时间戳获得的offset为空呢?

作者头像
create17
发布于 2020-09-24 07:53:12
发布于 2020-09-24 07:53:12
3K00
代码可运行
举报
运行总次数:0
代码可运行
每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。

放弃不难,但坚持很酷~

kafka_2.11-1.1.0

一、前言

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

https://stackoverflow.com/questions/30030393/strange-behavior-of-kafka-tool-kafka-tools-getoffsetshell

其中已经有大佬给出了答案,但是我还是不求甚解,但起码知道了和 kafka log segments 有关系。

经过研究实践,明白了其中缘由,所以就有了这篇文章。

二、解惑

./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 命名,如下图所示:

每一个 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 而已,无法精确。如果精确,可以调用 java api 来封装成接口或工具使用。

三、调用 kafka java api 获取时间戳对应的 offset,并封装成工具脚本

很纳闷,为什么官方不提供获取时间戳对应的精准的 offset 呢?既然官网没有,那我就用 java api 封装一个工具脚本吧。

先展示下效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./bin/getoffsetts --broker-list message-1:9092 --topic hiacloud-ts-v3 --time 1600222353353

脚本选项:

其实上面的 getoffsetts 脚本是执行的一个 java 类,java main() 方法。利用了 JCommander 。JCommander 是一个用于解析命令行参数的 Java 框架,利用 @Parameter 来接收命令参数。

在 main() 函数里面,创建 JCommander 对象,将 args 加载进去,

然后使用 consumer.offsetsForTimes(MaptimestampsToSearch) 来通过时间戳获取各分区对应的 offset 。

具体的代码已经上传到了

https://github.com/841809077/spring-boot-model/blob/master/src/main/java/com/example/main/OffsetTimestamp.java

可以直接粘贴到自己的项目中使用这个类查询 offset 。

这个项目算是一个快速可复用项目,支持自定义打包、统一异常处理等,感兴趣的可以下载下来看看。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据实战演练 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kafka-生产者(Producer)
作者介绍:简历上没有一个精通的运维工程师。下面的思维导图也是预计更新的内容和当前进度(不定时更新)
运维小路
2025/06/07
790
Kafka-生产者(Producer)
悄悄掌握 Kafka 常用命令,再也不用全网搜索了(建议收藏)
前言 对于从事大数据相关职位的朋友们来说,使用 kafka 的频率应该不会少。为了解决各位在操作 kafka 时记不住命令参数的痛点,所以我整理了一下在我工作中经常用到的 kafka 实操命令,希望各位看官能够喜欢。 kafka版本:2.11-1.1.0
create17
2020/12/16
9.5K0
悄悄掌握 Kafka 常用命令,再也不用全网搜索了(建议收藏)
Kafka 常用运维脚本
集群管理 (1)启动 broker $ bin/kafka-server-start.sh daemon <path>/server.properties (2)关闭 broker $ bin/kafka-server-stop.sh topic 管理 kafka-topics.sh 脚本 # 创建主题 $ bin/kafka-topics.sh --create --zookeeper localhost:2181 --partitions 64 --replication-factor 3 --topi
张乘辉
2020/08/27
1.4K0
【kafka原理】kafka Log存储解析以及索引机制
启动之后kafka-client发送一个topic为消息szz-test-topic的消息
石臻臻的杂货铺[同名公众号]
2021/07/14
2.3K0
Kafka重置消费的OffsetKafka源码分析-汇总
Kafka消费后都会提交保存当前的消费位置offset, 可以选择保存在zk, 本地文件或其他存储系统; Kafka 0.8以后提供了Coordinator的角色,.Coordinator除了可以来协
扫帚的影子
2018/09/05
2.2K0
Kafka运维命令大全
1、集群管理 前台启动broker bin/kafka-server-start.sh <path>/server.properties Ctrl + C 关闭 后台启动broker bin/kafka-server-start.sh -daemon <path>/server.properties 关闭broker bin/kafka-server-stop.sh 2、Topic管理 创建topic bin/kafka-topics.sh --create --zookeeper localhost:21
用户6070864
2019/09/17
1.2K0
Kafka运维命令大全
获取Kafka每个分区最新Offset的几种方法
更详细的代码工程,可以参考我的GitHub 消费者获取分区列表,并获取分区最新的OFFSET
大江小浪
2019/09/26
6.1K0
获取Kafka每个分区最新Offset的几种方法
Kafka 常用脚本与配置
脚本 作用 kafka-server-start.sh kafka启动 kafka-server-stop.sh kafka停止 kafka-topics.sh 查看创建删除topic kafka-c
兜兜毛毛
2020/12/31
7930
Kafka:常用命令
启动Kafka:kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties 创建一个叫test的话题,有两个分区,每个分区3个副本:kafka-topics.sh --zookeeper localhost:2181 --create --topic test --replication-factor 3 --partitions 2 查看创建的topic:kafka-topics.sh --zookeeper localhost:2
栗筝i
2022/12/01
5940
消息队列探秘-Kafka全面解析
在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息队列在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束
高广超
2018/12/05
8190
消息队列探秘-Kafka全面解析
Kafka的2种日志清理策略感受一下
Kafka是一个基于日志的流处理平台,一个topic可以有多个分区(partition),分区是复制的基本单元,在单节点上,一个分区的数据文件可以存储在多个磁盘目录中,配置项是:
Spark学习技巧
2019/08/06
2.2K0
Kafka的2种日志清理策略感受一下
重磅好文!现场故障回顾:最新版Kafka数据过期未删除问题的源码深入剖析与终极解决方案总结
周五晚上电话轰炸,驻场人员反映某公安厅数据上报业务故障。究其原因是数据域Kafka集群不可用。经过排查发现虽然Kafka集群设置了3天数据过期时间(且Topic级别未单独设置别的过期时间)。按道理来说,数据只会保留3天左右。实际情况是很早之前已经过期的数据并未正常删除,造成集群多个节点磁盘爆满。
用户9421738
2024/07/02
4130
重磅好文!现场故障回顾:最新版Kafka数据过期未删除问题的源码深入剖析与终极解决方案总结
进击消息中间件系列(三):Kafka 中 shell 命令使用
注:partitions指定topic分区数,replication-factor指定topic每个分区的副本数。
民工哥
2023/08/22
5620
进击消息中间件系列(三):Kafka 中 shell 命令使用
Kafka日志分段与消息查找
Kafka作为一个消息中间件(后面Kafka逐渐转向一个流失处理平台KafkaStream),消息最终的存储都落在日志中。
shysh95
2020/03/06
4K0
Kafka日志分段与消息查找
kafka的消息持久化文件
我们都知道,topic是有分区(partition)的概念的, 生产者往同一个topic发送的消息最终是发送到了不同的分区里面。也就是说,一个topic里的消息是由该topic下所有分区里的消息组成的。在同一个分区里,消息是有序的,而不同分区中,消息是不能保证有序的。
陈猿解码
2023/02/28
4110
kafka的消息持久化文件
Kafka - 3.x 文件存储不完全指北
Kafka是一个分布式流处理平台,它使用发布-订阅模型来处理消息流。Kafka的数据存储机制主要涉及到以下几个关键组件:Topics(主题)、Partitions(分区)和Segments(段)。
小小工匠
2023/10/29
2580
Kafka - 3.x 文件存储不完全指北
Kafka基础(一):基本概念及生产者、消费者示例
Kafka 起初是由 LinkedIn 公司采用 Scala 语言开发的一个多分区、多副本且基于 Zookeeper 协调的分布式消息系统,现已被捐献给 Apache 基金会。目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性被广泛使用。目前越来越多的开源式分布处理系统如:Storm、Spark、Flink 等都支持与 Kafka 集成。
create17
2019/06/19
9470
【云原生进阶之PaaS中间件】第三章Kafka-4.3.1-broker 工作流程
这一部分大体了解下kafka Broker的工作流程,看一下zookeeper在kafka broker工作中发挥的作用,那些重要数据在zookeeper中存储。
江中散人_Jun
2024/02/07
2610
【云原生进阶之PaaS中间件】第三章Kafka-4.3.1-broker 工作流程
Kafka快速入门(Kafka Broker)节点服役和退役、手动调整副本
(3)查看/kafka/brokers/topics/first/partitions/0/state 路径上的数据。
鱼找水需要时间
2023/02/16
1K0
Kafka快速入门(Kafka Broker)节点服役和退役、手动调整副本
Kafka原理和实践
本文从Kafka的基本概念、特点、部署和配置、监控和管理等方面阐述 Kafka 的实践过程。
杨振涛
2019/08/08
1.5K0
相关推荐
Kafka-生产者(Producer)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验