kafka日志分段(.log文件)及日志文件索引机制(偏移量索引、时间戳索引)

2023-11-10

Kafka版本:2.2.1

环境:CDH

日志分段(segment)

格式

在kafka数据存储的目录下,进入topic文件目录,可以看到多个文件,如下,从文件名可以看出,.log.index.timeindex文件一一对应:

-rw-r--r--. 1 kafka kafka    245432 Feb 25 13:01 00000000000000000000.index
-rw-r--r--. 1 kafka kafka 909769306 Feb 25 11:31 00000000000000000000.log
-rw-r--r--. 1 kafka kafka    343392 Feb 25 13:01 00000000000000000000.timeindex
-rw-r--r--. 1 kafka kafka  10485760 Mar  1 08:56 00000000000001778276.index
-rw-r--r--. 1 kafka kafka 265569655 Mar  1 08:56 00000000000001778276.log
-rw-r--r--. 1 kafka kafka        10 Feb 25 13:01 00000000000001778276.snapshot
-rw-r--r--. 1 kafka kafka  10485756 Mar  1 08:56 00000000000001778276.timeindex

文件说明

文件类别 作用
.index 消息的物理地址的偏移量索引文件
.timeindex 映射时间戳和相对offset的时间戳索引文件
log 日志文件(消息存储文件)
.snapshot 对幂等型或者事务型producer所生成的快照文件
leader-epoch-checkpoint 保存了每一任leader开始写入消息时的offset, 会定时更新

参数配置

  • .log文件可以通过server.properties文件进行配置

    # The maximum size of a log segment file. When this size is reached a new log segment will be created.
    log.segment.bytes=1073741824(1G)
    
  • 文件的存储目录可以通过server.properties进行配置

    # A comma separated list of directories under which to store log files
    log.dirs=/tmp/kafka-logs
    

log文件内容

输出批消息日志

命令

kafka-dump-log --files 00000000000001778276.log

输出内容

baseOffset: 1778276 lastOffset: 1778362 count: 87 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 0 CreateTime: 1645765269680 size: 44169 magic: 2 compresscodec: NONE crc: 1917853349 isvalid: true
baseOffset: 1778363 lastOffset: 1778431 count: 69 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 44169 CreateTime: 1645765272680 size: 34959 magic: 2 compresscodec: NONE crc: 1371007139 isvalid: true
baseOffset: 1778432 lastOffset: 1778446 count: 15 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 79128 CreateTime: 1645765272681 size: 7797 magic: 2 compresscodec: NONE crc: 464128466 isvalid: true
baseOffset: 1778447 lastOffset: 1778511 count: 65 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 86925 CreateTime: 1645765275680 size: 33145 magic: 2 compresscodec: NONE crc: 992223742 isvalid: true
baseOffset: 1778512 lastOffset: 1778529 count: 18 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 120070 CreateTime: 1645765275681 size: 9309 magic: 2 compresscodec: NONE crc: 1123370590 isvalid: true

输出具体数据

命令

kafka-dump-log --files 00000000000001778276.log --print-data-log

输出内容

baseOffset: 1778276 lastOffset: 1778362 count: 87 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 0 CreateTime: 1645765269680 size: 44169 magic: 2 compresscodec: NONE crc: 1917853349 isvalid: true
| offset: 1778276 CreateTime: 1645765269675 keysize: -1 valuesize: 501 sequence: -1 headerKeys: [] payload: 20220225    13:01:09
| offset: 1778277 CreateTime: 1645765269675 keysize: -1 valuesize: 510 sequence: -1 headerKeys: [] payload: 20220225    13:01:09
……
| offset: 1778361 CreateTime: 1645765269680 keysize: -1 valuesize: 500 sequence: -1 headerKeys: [] payload: 20220225    13:01:09
| offset: 1778362 CreateTime: 1645765269680 keysize: -1 valuesize: 458 sequence: -1 headerKeys: [] payload: 20220225    13:01:09
baseOffset: 1778363 lastOffset: 1778431 count: 69 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 44169 CreateTime: 1645765272680 size: 34959 magic: 2 compresscodec: NONE crc: 1371007139 isvalid: true
| offset: 1778363 CreateTime: 1645765272675 keysize: -1 valuesize: 501 sequence: -1 headerKeys: [] payload: 20220225    13:01:12
……
| offset: 1778431 CreateTime: 1645765272680 keysize: -1 valuesize: 517 sequence: -1 headerKeys: [] payload: 20220225    13:01:12
baseOffset: 1778432 lastOffset: 1778446 count: 15 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 79128 CreateTime: 1645765272681 size: 7797 magic: 2 compresscodec: NONE crc: 464128466 isvalid: true
| offset: 1778432 CreateTime: 1645765272680 keysize: -1 valuesize: 519 sequence: -1 headerKeys: [] payload: 20220225    13:01:12
……

分析

  1. 一条批消息(Record Batch)日志记录,包含多条的实际数据
  2. lastOffset - baseOffset + 1 = countbaseOffsetlastOffset为批消息中第一条记录和最后一条记录的偏移量,在整个topic分区中的偏移量,count为批消息中包含的记录数
  3. position为批消息的起始位置(这里应该是物理地址),每个log文件中,position 都是从0开始的
  4. CreateTime在批消息中为批消息中最后一条记录的创建时间,在记录中为记录的创建时间
  5. size为批消息的大小,从内容可以看出,前一条批消息的position,加上前一条消息的size,结果为后一条消息的position
  6. offset为记录的偏移量,整个topic分区中的偏移量
  7. valuesize为一条记录的大小
  8. 其他字段有些没有用到,所以显示-1,有些暂时也不清楚

偏移量索引

.index文件内容

命令:

kafka-dump-log --files 00000000000001778276.index

输出内容:

Dumping 00000000000001778276.index
offset: 1778431 position: 44169
offset: 1778446 position: 79128
offset: 1778511 position: 86925
offset: 1778529 position: 120070
offset: 1778592 position: 129379
offset: 1778608 position: 161537
offset: 1778672 position: 169791
offset: 1778694 position: 202354
offset: 1778760 position: 213640
……

分析

个人参考资料分析,不具有权威

结合**.index.log**文件内容可以看出:

  1. .index文件中的offset对应log文件中的lastOffset
  2. .index文件中的position对应log文件中的position

Kafka的数据都是按序插入的,offset也是按序增长的,因此很适合用二分查找定位指定偏移量的数据(网上也都是说用的二分查找):

  1. 根据二分查找,定位数据所在的logindex文件
  2. 通过二分查找,定位最大不大于指定偏移量的offset
  3. 根据查找到的offset,定位到批消息位置
  4. 在批消息中通过position定位到指定数

时间戳索引

.timeindex文件内容

命令:

kafka-dump-log --files 00000000000001778276.timeindex

输出内容:

Dumping 00000000000001778276.timeindex
timestamp: 1645765272680 offset: 1778427
timestamp: 1645765272681 offset: 1778442
timestamp: 1645765275680 offset: 1778507
timestamp: 1645765275681 offset: 1778521
timestamp: 1645765278680 offset: 1778583
timestamp: 1645765278681 offset: 1778597
timestamp: 1645765281680 offset: 1778667

分析

个人参考资料分析,不具权威

在**.timeindex**文件中:

  1. 一条记录中的timestampoffset,表示创建时间为timestamp的第一条记录的offset,即创建时间为1645765272680的多条记录中,最小的偏移量为1778427
  2. 网上的资料都说,.timeindexindex文件中的offset是一致的,这与我实际查询的不符

根据时间戳定位指定数据:

  1. 查找该时间戳应该在哪个日志分段中。将指定的时间戳和每个日志分段中最大时间戳largestTimeStamp逐一对比,直到找到最小不小于指定时间戳所对应的日志分段

    日志分段中的largestTimeStamp的计算是:先查询该日志分段所对应时间戳索引文件,找到最后一条索引项,若最后一条索引项的时间戳字段值大于0,则取该值,否则取该日志分段的最近修改 时间

  2. 找到日志分段后,在相应的timeindex文件中,通过二分查找,找到最大不大于指定时间戳的offset

  3. log文件中,通过offset进行顺序查找

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kafka日志分段(.log文件)及日志文件索引机制(偏移量索引、时间戳索引) 的相关文章

  • 2TB CSV 中的帐号匿名化

    我有大约 2TB 的 CSV 其中第一个2 列包含两个身份证号码 这些数据需要匿名 以便数据可用于学术研究 匿名化可以 但不一定 是不可逆的 这些不是医疗记录 所以我不需要最奇特的加密算法 问题 标准哈希算法会生成很长的字符串 但我必须进行
  • offsetLeftAndRight() 到底做了什么?

    offsetLeftAndRight 到底做了什么 文档说 将此视图的水平位置偏移指定的像素量 那么 这是否意味着如果视图的左侧位置假设为 50 并且在其上调用 offsetLeftAndRight 20 那么视图将移动 20 像素并且其左
  • 如何在Hadoop中设置数据块大小?改变它有好处吗?

    如果我们可以更改 Hadoop 中的数据块大小 请告诉我如何操作 更改块大小是否有利 如果是 请告诉我为什么以及如何更改 如果没有 请告诉我为什么以及如何 您可以随时更改块大小 除非dfs blocksize参数在 hdfs site xm
  • 为什么 Bootstrap-3 中没有 col-xs-offset-* 类?

    我读到Twitter Bootstrap 3 文档 http getbootstrap com css grid offsetting它不支持col xs offset 类 这似乎不符合移动优先 有充分的理由吗 我认为它们可能有用 I re
  • Hive alter table 更改列名称为重命名的列提供“NULL”

    我曾尝试将表中的现有列重命名为新列 但名称更改后 新列只给我 NULL 值 Parquet 中表的存储格式 例如 user 是 Test 表中字符串数据类型的列 插入了值为 John 的示例记录 Select user from Test
  • PHP 警告:非法字符串偏移

    我是 PHP 新手 今天 PHP 从 5 3 3 版本迁移到 5 4 4 版本 Debian Squeeze 到 Debian Wheezy 之后 我从 Apache 日志中收到此错误 gt PHP 警告 xyz 中的非法字符串偏移 php
  • Pig - 如何迭代一袋地图

    让我解释一下这个问题 我有这行代码 u FOREACH persons GENERATE FLATTEN 0 experiences as j dump u 产生以下输出 id 1 date begin 12 2012 descriptio
  • 将 data.frame 转换为 ff

    我想将 data frame 转换为 ff 对象 并使用 as ffdf 进行描述here https stackoverflow com questions 15787221 how can i apply ffdf to non ato
  • 在 R 中对非常大的数据集(180 万行 x 270 列)进行建模

    我正在研究一个视窗8操作系统带有8 GB 内存 我有一个数据框180 万行 x 270 列我必须对其执行glm logit 任何其他分类 我尝试使用 ff 和 bigglm 包来处理数据 但我仍然面临错误的问题 Error cannot a
  • 如何使用element.offsetBottom?

    因此 当你滚动经过英雄时 我正在努力制作一个粘性导航 我使用时没有遇到任何问题element offsetTop前 但我正在尝试找到一种方法来对元素的底部执行此操作 element offsetBottom似乎没什么 那么有没有办法在JS中
  • 是否可以在表之间创建关系?

    Bigquery 看起来很棒 我有一个数据库类型 ETL 其中我的方案在实体之间有多种关系 我想知道是否有办法在它们之间建立关系 或者是否可以在数据集之间以某种方式模拟它们 请原谅我的英语 这不是我的语言 而且我不太了解它 您无法在 Big
  • 如何确定 HBase 表的大小?有什么命令可以这样做吗?

    我的 Hbase shell 上有多个表 我想将它们复制到我的文件系统上 有些表超过 100GB 但是 我的本地文件系统中只剩下 55GB 可用空间 因此 我想知道 hbase 表的大小 以便我可以仅导出小尺寸的表 任何建议表示赞赏 谢谢
  • Hive 中字符串数据类型是否有最大大小?

    谷歌了很多 但没有在任何地方找到它 或者这是否意味着只要允许集群 Hive 就可以支持任意大字符串数据类型 如果是这样 我在哪里可以找到我的集群可以支持的最大字符串数据类型大小 提前致谢 Hive 列表的当前文档STRING作为有效的数据类
  • (R 错误)错误:cons 内存耗尽(达到限制?)

    我正在处理大数据 并且有一个 70GB 的 JSON 文件 我正在使用 jsonlite 库将文件加载到内存中 我尝试过 AWS EC2 x1 16large 机器 976 GB RAM 来执行此负载 但 R 因错误而中断 Error co
  • hadoop中reducer的数量

    我正在学习hadoop 我发现减速器的数量非常令人困惑 1 reducer的数量与partition的数量相同 2 reducer 的数量是 0 95 或 1 75 乘以 节点数 每个节点的最大容器数 3 减速机数量设定为mapred re
  • jq Streaming - 过滤嵌套列表并保留全局结构

    在一个大型 json 文件中 我想从嵌套列表中删除一些元素 但保留文档的整体结构 我的示例将其输入为 但真实的输入足够大以要求流式传输 keep untouched keep this this list filter this keep
  • Spark 有没有办法捕获执行器终止异常?

    在执行我的 Spark 程序期间 有时 其原因对我来说仍然是个谜 yarn 会杀死容器 执行器 并给出超出内存限制的消息 我的程序确实恢复了 但 Spark 通过生成一个新容器重新执行任务 但是 在我的程序中 任务还会在磁盘上创建一些中间文
  • 使用 mapWithState Spark Streaming 过滤部分重复项

    我们有一个DStream 比如 val ssc new StreamingContext sc Seconds 1 val kS KafkaUtils createDirectStream String TMapRecord ssc Pre
  • 查找给定城市的 UTC 偏移量

    在 Windows 上的 C 中 给定一个城市 比如伦敦 纽约 悉尼或新加坡等 我如何找到每个城市的 UTC 偏移量 即该函数应该能够接受城市名称并返回 UTC 偏移量当前的情况 即考虑夏令时 任何想法如何使用 win32 API 来完成此
  • Spark KMeans 无法处理大数据吗?

    KMeans 有几个参数training http spark apache org docs latest api python pyspark mllib html highlight kmeans pyspark mllib clus

随机推荐

  • python粒子群算法工具包_python进阶教程:实现粒子群算法(PSO)详解

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 这篇文章主要介绍了Python编程实现粒子群算法 PSO 详解 涉及粒子群算法的原理 过程 以及实现代码示例 具有一定参考价值 需要的朋友可以了解下 文章目录 1 原理 2
  • Transformer学习笔记

    Transformer是第一个完全依赖于自我注意力机制来计算输入和输出表征的转导模型 而不使用序列对齐的RNNs或卷积 Figure 1 左 Transformer整体结构 右 编解码器内部结构图 Encoder Decoder 编码器 由
  • 虚拟机没有显示ip地址

    之所以写这篇博客是因为有个同学刚搭建完虚拟机但没有IP地址 为了帮助那个同学和回顾知识 所以有了这篇博客 而且网上大部分博客都没提到networkmanager的问题 所以这边就记录一下 一 检查网络连接模式是否为NAT模式 在VMware
  • Redis学习:Redis实现乐观锁

    实际这部分是接着事务那一块 加了一个watch命令 这里要有一个乐观锁和悲观锁的概念 悲观锁 很悲观 认为什么时候都会出现问题 无论做什么都会加锁 乐观锁 很乐观 认为什么时候都不会出现问题 所以不会上锁 更新数据的时候去判断一下 在此期间
  • Python提取PDF中的图片

    插播一条老家自产的糖心苹果 多个品种 欢迎选购 有问题随时私信我 来自雪域高原的馈赠 海拔2000米的大凉山高原生态糖心苹果 https blog csdn net qq 15969343 article details 126107252
  • VUE H5 页面借助 dsbridge 嵌入到 app 中(前端)

    H5 页面嵌入 app 中 不得不面对 web 和 native 之间进行交互的问题 比如 传递参数 调用函数等 至于交互的桥梁目前 github 上有一些开源的 其中使用最广的是 jsBridge 然而 最近刚开源了一个新项目 dsbri
  • Canal实现Mysql数据同步至Redis、Elasticsearch

    文章目录 1 Canal简介 1 1 MySQL主备复制原理 1 2 canal工作原理 2 开启MySQL Binlog 3 安装Canal 3 1 下载Canal 3 2 修改配置文件 3 3 启动和关闭 4 SpringCloud集成
  • 【Lua】Table根据value排序

    使用lua开发需要把有用的数据全部存进Table里 lua也提供了一个sort接口来给table排序 但是sort的实现也是基于冒泡排序 他默认table的key是从1开始的 这样就会造成当我们的key是一些特殊的标志位 比如游戏中背包数据
  • 深入浅出JMS(二)--ActiveMQ简单介绍以及安装

    现实的企业中 对于消息通信的应用一直都非常的火热 而且在J2EE的企业应用中扮演着特殊的角色 所以对于它研究是非常有必要的 上篇博文深入浅出JMS 一 JMS基本概念 我们介绍了消息通信的规范JMS 我们这篇博文介绍一款开源的JMS具体实现
  • Ubuntu:配置环境变量的两种常用方法( .bashrc 和 /etc/profile )

    环境变量 什么是环境变量 简单地说 环境变量就是当前环境下的参数或者变量 如果说的专业一点就是指在操作系统中用来指定操作系统的一些参数 如最常见的环境变量 PATH 它的用途就是当用户要求系统运行一个程序而没有告诉它程序所在的完整路径时 系
  • iphone数据传输已取消怎么办_iPhone被停用怎么办?iPhone如何解除停用状态?

    面对iPhone已停用状态 我们该怎么解决 这或许会是很多人存在的疑问 有个好消息是 在你的iPhone被停用的情况下 我们还是有办法能够让iPhone复活 虽然 过程有点曲折 但是努力的话总归是有结果的 下面将为大家介绍下 iPhone被
  • c语言函数返回变量的地址,浅谈C语言函数返回值--局部变量和局部变量地址

    下面的内容是在C专家编程里面看到的 摘录于此 在C语言中 局部变量的作用域只在函数内部 在函数返回后 局部变量的内存就会被释放 如果函数只是返回局部变量 那么这个局部变量会被复制一份传回被调用处 但是如果函数返回的是局部变量的地址 那么就会
  • Vmware中鼠标移动时滚轮失效没反应Ubuntu20.04.1

    通过安装imwheel解决 先更新软件源 sudo apt get update 安装imwheel sudo apt get install imwheel 在 目录下创建 imwheelrc文件 cd sudo vim imwheelr
  • 使用Sklearn的SVM接口实现鸢尾花分类

    Iris Data Set Iris Data Set 鸢尾属植物数据集 是历史比较悠久的数据集 它首次出现在著名的英国统计学家和生物学家Ronald Fisher 1936年的论文 The use of multiple measurem
  • Docker安装Redis6

    1 拉取redis镜像 docker pull redis 6 2 创建redis映射目录 mkdir p usr local docker redis 3 下载redis conf到映射目录 cd usr local docker red
  • 数据挖掘而之数据清洗

    数据清洗 是整个数据分析过程中不可缺少的一个环节 其结果质量直接关系到模型效果和最终结论 在实际操作中 数据清洗通常会占据分析过程的50 80 的时间 国外有些学术机构会专门研究如何做数据清洗 相关的书籍也不少 美亚搜data cleani
  • CentOS7安装Redis5.0.5

    1 下载redis mkdir home redis cd home redis wget http download redis io releases redis 5 0 5 tar gz tar xzvf redis 5 0 5 ta
  • qt判断文件是否为空_Qt中文文档-QFile

    本项目地址 https github com QtDocumentCN QtDocumentCN github com QFile Class QFile 类提供读写文件的接口 bledata draft node block data d
  • LeetCode-1592-重新排列单词间的空格

    1592 重新排列单词间的空格 说明 给你一个字符串 text 该字符串由若干被空格包围的单词组成 每个单词由一个或者多个小写英文字母组成 并且两个单词之间至少存在一个空格 题目测试用例保证 text 至少包含一个单词 请你重新排列空格 使
  • kafka日志分段(.log文件)及日志文件索引机制(偏移量索引、时间戳索引)

    Kafka版本 2 2 1 环境 CDH 日志分段 segment 格式 在kafka数据存储的目录下 进入topic文件目录 可以看到多个文件 如下 从文件名可以看出 log index timeindex文件一一对应 rw r r 1