大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解

news2024/12/25 12:44:55

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(正在更新…)

章节内容

上节我们完成了如下内容:

  • 物理存储 日志存储概述
  • LogSegment
  • 日志切分文件
  • 索引切分过程
  • 索引文件等等

在这里插入图片描述

索引文件

偏移量索引文件用于记录消息偏移量与物理地址之间的映射关系,时间戳索引文件则根据时间戳查找对应的偏移量。
文件:查看一个topic分区目录下的内容,发现有Log,Index和Timeindex三个文件:

  • log文件名是以文件中第一条message的offset来命名的,实际offset长度是64位,但是这里只使用20位,应付生产是足够的。
  • 一组index+log+timeindex文件的名字是一样的,并且log文件默认写满1G之后,会进行log rolling形成一个新的组合记录消息,这个通过Broker端log.segment.bytes=1073741824指定的。
  • index和timeindex在刚使用时会分配10M的大小,当进行log rolling后,它会修剪为实际的大小。

index 和 timeindex 内容如下:
在这里插入图片描述

创建主题

kafka-topics.sh --zookeeper h121.wzk.icu:2181 --create --topic wzk_test_demo_05 --partitions 1 --replication-factor 1 --config segment.bytes=104857600

执行结果如下图:
在这里插入图片描述

创建消息

for i in `seq 10000000`; do echo "hello kangkang $i" >> test_data.txt; done

生产消息

kafka-console-producer.sh --broker-list h121.wzk.icu:9092 --topic wzk_test_demo_05 < test_data.txt

运行结果如下图:
在这里插入图片描述

查看存储

cd /opt/kafka-logs
cd wzk_test_demo_05-0
ll

运行结果如下图:
在这里插入图片描述

查看详细

如果想查看这些文件,可以使用Kafka提供的Shell来完成,几个关键信息如下:

  • Offset 是主键增加的整数,每个offset对应一个消息的偏移量
  • Position:消息批字节数,用于计算物理地址
  • CreateTime:时间戳
  • Magic:2代表这个消息类型是V2,如果是0则代表是V0,1代表V1类型。
  • Compresscodec:None说明没有指定压缩类型,Kafka目前提供了4种可选择:0-Node、1-GZIP、2-Snappy、3-lz4。
  • crc:对所有字段进行校验后的crc值
kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.log --print-data-log | head

执行结果如下图:
在这里插入图片描述

消息偏移

消息存储

  • 消息内容保存在log日志文件中
  • 消息封装为Record,追加到log日志文件末尾,采用的是顺序写模式。
  • 一个topic的不同分区,可认为是queue,顺序写入接受到的消息

在这里插入图片描述
消费者有Offset,下图中,消费者A消费的Offset是9,消费者B消费的Offset是11,不同的消费者Offset是交给一个内部公共topic来记录的。

在这里插入图片描述
时间戳索引文件,它的作用是可以让用户查询某个时间段的内的消息,它一条数据的结构是时间戳(8 byte) + 相对Offset(4 byte)。如果要使用这个索引文件,首先需要通过时间范围,找到相对Offset,然后再去对应的Index文件中找到Position信息,然后才能遍历log文件,它也需要使用上面说的Index文件的。

但是Producer生产消息可以指定消息的时间戳,这可能将导致消息的时间戳不一定有先后顺序,因为尽量不要生产消息时指定时间戳。

偏移量索引

  • 位置索引保存在Inde文件中
  • log日志默认每写入4K(log.index.interval.bytes设定的),会写入一条索引信息到index文件中,因此索引文件是稀疏索引,它不会为每条日志都建立索引信息。
  • log文件中的日志,是顺序写入的,由Message+实际Offset + Position组成
  • 索引文件的数据结构则是由相对Offset(4 byte) + Position(4 byte)组成,由于保存的是相对于第一个消息的相对Offset,只需要 4 byte就可以了,可以节省空间,在实际查找后还需要计算回实际的Offset,这对用户是透明的。

稀疏索引的密度不高,但是Offset有序,二分查找的时间复杂度为O(LogN),如果从头遍历时间复杂度是O(N)如下图:
在这里插入图片描述
偏移量索引由相对偏移量和物理地址组成:
在这里插入图片描述
可以通过下面的命令解析 .index 文件:

kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.index --print-data-log | head

注意:Offset 与 Position 没有直接关系,因为会删除数据和清理日志
注意:Offset 与 Position 没有直接关系,因为会删除数据和清理日志
注意:Offset 与 Position 没有直接关系,因为会删除数据和清理日志

执行结果如下图所示:
在这里插入图片描述

在偏移量索引文件索引中,索引数据都是顺序记录Offset,但时间戳索引文件中每个追加的索引时间戳必须大于之前追加的索引项,否则不予追加。在Kafka 0.11.0.0以后,消息元数据中存在若干的时间戳信息。
如果Broker端参数 log.message.timestamp.type 设置为 LogAppendTime,那么时间戳必定能保持单调增长。反之如果是CreateTime则无法保证顺序。

注意:timestamp文件中的Offset与Index文件中的relativeOffset不是一一对应的,因为数据的写入是各自追加的
注意:timestamp文件中的Offset与Index文件中的relativeOffset不是一一对应的,因为数据的写入是各自追加的
注意:timestamp文件中的Offset与Index文件中的relativeOffset不是一一对应的,因为数据的写入是各自追加的

思考: 如何查看偏移量为23的消息?

Kafka中存在一个 ConcurrentSkipListMap来保存在每个日志分段中,通过跳跃表方式,定位到00000000000000000000.index,通过二分法在偏移量索引文件中找到不大于23的最大索引项,即Offset 20那栏,然后从日志分段文件中的物理位置为320开始顺序查找偏移量为23的消息。

时间戳

在偏移量索引文件中,索引数据都是顺序记录Offset,但时间戳索引文件中每个追加的索引时间戳必须大于之前追加的索引项,否则不予追加。
在Kafka 0.11.0.0以后,消息信息中存在若干的时间戳消息。如果Broker端参数log.message.timestamp.type设置为LogAppendTime,那么时间戳必定能保持单调增长。反之如果是CreateTime则无法保证顺序。

通过时间戳方式进行查找消息,需要通过查找时间戳索引和偏移量索引两个文件。
时间戳索引格式:前八个字节表示时间戳,后四个字节表示偏移量。

在这里插入图片描述

在这里插入图片描述

思考: 查找指定时间戳开始的消息?

假设某个时间戳为A

  • 查找时间戳A应该在哪个日志分段中,将A和每个日志分段中最大时间戳LargestTimestamp逐一对比,直到找到不小于A所对应的日志分段。
  • 日志分段中的LargestTimeStamp的计算是:先查询该日志分段所对应时间戳索引文件,找到最后一条索引项,若最后一条索引项的时间戳字段值大于0,则取该值,否则取该日志分段的最近修改时间。
  • 查找该日志分段的偏移量索引文件,查找该偏移量对应的物理地址。
  • 日志文件中从320的物理位置开始查找小于A的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1991699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SOMEIP_ETS_022:echoStaticUINT8Array_One_Dimensional

测试目的&#xff1a; 确保DUT能够正确处理一维静态UINT8数组参数&#xff0c;并且在发送和接收过程中保持参数值和顺序不变。 描述 本测试用例将验证DUT在处理包含一维静态UINT8数组参数的SOME/IP消息时&#xff0c;是否能够准确地发送和接收这些参数&#xff0c;确保返回的…

[数据结构] 万字解析排序算法

文章目录 快速排序双指针法整体排序过程整理选择基准值&#xff08;Pivot&#xff09;单趟划分&#xff08;Partitioning&#xff09;递归分治&#xff08;Divide and Conquer&#xff09;终止条件合并 整体代码实现为什么相遇位置一定是小值&#xff1f;情况 1: 右指针j找到了…

HexView 刷写文件脚本处理工具-基本功能介绍(七)-导出VBF/GM/GM-FBL

导出Ford VBF数据容器 VBF文件格式是Ford和Volvo Cars使用的多功能二进制格式。此文件的输出基于“Versatile Binary Format”规范,版本从2.2至2.5。在对话框中输入的所有值将被写入INI文件。INI文件也可以用于命令行选项,以在不需要用户输入的情况下生成输出。 导出GM数据…

网卡与Linux网络结构(中)

1 socket数据结构 socket源码 socket结构体是操作系统网络编程接口的一个核心组件。在操作系统中&#xff0c;socket结构体定义了一个网络连接的抽象&#xff0c;包括文件描述符、地址信息、连接状态等。 socket结构体代码位于<include/linux/net.h> struct socket { s…

android13 串口编号修改 串口名修改

总纲 android13 rom 开发总纲说明 目录 1.前言 2.技术分析 别名定义的语法规则 3.修改示例 使用别名 注意事项 4.不生效分析 5.编译查看 6.其他方法 7.彩蛋 1.前言 更改Android设备的串口编号涉及对系统深层次的配置进行修改,通常是为了解决硬件兼容性问题或满足特…

MySQL:约束

目录 1、约束 1.1 约束类型 2、非空约束 2.1 没有指定not null 2.2 指定not null 3、唯一约束 3.1 没有指定unique 3.2 指定unique 4、默认约束 5、主键约束 5.1 主键 5.2 主键自增类型 5.2.1 主键自增全列插入 5.2.2 主键自增指定列插入 5.3 复合主键 6、外键约…

探秘充电桩测试负载箱

随着电动汽车的普及&#xff0c;充电桩已经成为了城市中不可或缺的一部分。为了保证充电桩的质量和安全性&#xff0c;对其进行严格的测试是必不可少的。而在这个过程中&#xff0c;充电桩测试负载箱扮演着至关重要的角色。那么&#xff0c;什么是充电桩测试负载箱&#xff1f;…

【问题记录】Python中用yield实现打字机效果

用yield实现打字机效果 前言示例注意点 前言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;yield 函数在处理大数据集和实现异步编程时非常重要。 异步编程是一种常见的编程模式&#xff0c;它可以提高程序的执行效率。yield 可以用于实现协程&#xff0c;使得程序在…

未来已来:人工智能如何重塑Facebook的用户体验?

在数字化时代的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;正成为推动技术进步和用户体验优化的核心力量。Facebook&#xff08;现Meta Platforms&#xff09;作为全球领先的社交媒体平台&#xff0c;正在充分利用人工智能技术&#xff0c;以重塑用户体验&#xff0…

文档翻译免费软件有哪些?不容错过的5个翻译利器

大学生暑期生活日常都丰富多彩&#xff0c;充满了挑战与收获。 他们不仅沉浸在外语学习的海洋中&#xff0c;努力提升语言能力&#xff0c;还深入钻研各类论文文献&#xff0c;积极探索学术的无限可能。然而&#xff0c;在这个过程中&#xff0c;不同语言的资料往往成为他们求…

spring boot3.x快速入门

下一篇&#xff1a;Spring Boot 3.x gradle脚手架工程build.gradle详解 本教程将基于gradle项目构建工具来快速构建一个spring boot 3.x的最简单的web应用&#xff0c;其中涉及各种构建技巧和细节&#xff0c;希望能帮到初学者~ 文章目录 先决条件JDK17gradle全局配置 gradle项…

RAPTOR模型在长文档知识检索中的应用

人工智能咨询培训老师叶梓 转载标明出处 传统的检索增强型语言模型&#xff08;RALMs&#xff09;在检索时往往只关注短且连续的文本块&#xff0c;这限制了它们对整体文档上下文的全面理解。例如&#xff0c;在需要整合文本多个部分知识的主题性问题上&#xff0c;如理解整本书…

哈佛大学单细胞课程|笔记汇总 (六)

哈佛大学单细胞课程|笔记汇总 &#xff08;五&#xff09; 哈佛大学单细胞课程|笔记汇总 &#xff08;四&#xff09; &#xff08;六&#xff09;Single-cell RNA-seq clustering analysis: aligning cells across conditions 我们的数据集包含来自两个不同条件&#xff08…

Java JDK 国内外下载镜像地址及安装

Java JDK 国内下载镜像地址及安装 一、Java JDK 国内下载镜像地址及安装二、国外快速下载jdk 一、Java JDK 国内下载镜像地址及安装 各种JAVA JDK的镜像分发&#xff1a;https://www.injdk.cn/ 华为oracle jdk镜像&#xff1a;https://repo.huaweicloud.com/java/jdk/ 华为op…

python:VOC格式数据集转换为YOLO数据集格式

作者&#xff1a;CSDN _养乐多_ 本文将介绍如何将目标检测中常用的VOC格式数据集转换为YOLO数据集&#xff0c;并进行数据集比例划分&#xff0c;从而方便的进行YOLO目标检测。 如果不想分两步&#xff0c;可以直接看第三节代码。 文章目录 一、将VOC格式数据集转换为YOLO格…

司美格鲁肽,又名索玛鲁肽;Semaglutide;CAS号:910463-68-2

司美格鲁肽&#xff0c;又名索玛鲁肽&#xff1b;Semaglutide&#xff1b; CAS号&#xff1a;910463-68-2 分子量&#xff1a;4113.58 结构图&#xff1a; 司美格鲁肽&#xff0c;又名Semaglutide (上海楚肽生物科技有限提供&#xff09; 分子式&#xff1a;C187H291N45O59 …

nginx和php工具的使用

一、本地主机通过域名访问自己写的网页 1、开启phpstudy 2、找到phpstudy目录下的www文件夹&#xff0c;创建less01文件夹、index.html、web.php文件&#xff0c;进行配置&#xff0c;如下图&#xff1a; 3、重启一下phpstudy&#xff0c;然后访问网页 4、上面只能通过文件目录…

MIMO系统中差分空间调制解调matlab误码率仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 空间调制原理 4.2 发送端模型 4.3 接收端模型 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完…

打开法学著作的AI新方式:元典问达「知识+」正式上线!

号外&#xff01;号外&#xff01; 元典问达正式上新 「知识」 法律人现在可以在「知识」板块&#xff0c;直接与《刑法注释书》、《刑事诉讼法注释书》“对话”&#xff0c;通过提问&#xff0c;获得权威法学出版物总结而成的刑事法律解读和案例分析&#xff01; 信息爆炸时…