时序数据库 Apache-IoTDB 源码解析之文件数据块(四)
上一章聊到行式存储、列式存储的基本概念,并介绍了 TsFile 是如何存储数据以及基本概念。详情请见:
时序数据库 Apache-IoTDB 源码解析之文件格式简介(三)
打一波广告,欢迎大家访问IoTDB 仓库,求一波 Star 。欢迎关注头条号:列炮缓开局,欢迎关注OSCHINA博客
这一章主要想聊一聊:
- TsFile的文件概览
- TsFile的数据块
TsFile文件概览
一个完整的 TsFile 是由图中的几大块组成,图中的数据块与索引块之间使用 1 个字节的分隔符 2
来进行分隔,对于分隔符不做过多解释,校验和保证数据有效性。
1. 识别符(Magic)
现在各种软件五花八门,很多软件都拥有自己的文件格式用来存储数据内容,但当硬盘上文件非常多的时候如何有效的识别是否为自己的文件,确认可以打开呢?经常用 windows 系统的朋友可能会想到用扩展名,但假如文件名丢失了,那我们如何知道这个文件是不是能被程序正确访问呢?
这时候通常会使用一个独有的字符填充在文件开头和结尾,这样程序只要访问 1 个固定长度的字符就知道这个文件是不是自己能正常访问的文件了,当然,TsFile 作为一个数据库文件,肯定需要在这个识别符上精心打造一番,它看起来是这样:
(decimal) 84 115 70 105 108 101 (hex) 54 73 46 69 6c 65 (ASCII) T s F i l e
非常 cool 。
2.文件版本(Version)
再精妙的设计也难免产生一些问题,那么就需要升级,那么文件内容也一样,有时候当你的改动特别大了,就会出现完全不兼容的两个版本,这个很好理解不过多解释。TsFile 中采用了 6 个字节来保存文件版本信息,当前 0.9.x 版本看起来就是这样:
(decimal) 48 48 48 48 48 50 (hex) 30 30 30 30 30 32 (ASCII) 0 0 0 0 0 2
3.数据块
3.1 ChunkGroup
文件的数据块中包含了多个 ChunkGroup ,其中 ChunkGroup 的概念已经在上一章聊过,它代表了设备(逻辑概念上的一个集合),在 IoTDB 中称为 Device。
在实际的文件中,ChunkGroup是由多个 Chunk 和一个 ChunkGroupFooter 组成。其中最后一个 Chunk 的结尾和 ChunkGroupFooter 之间使用 1 个字节的分隔符 0
来做区分,ChunkGroupFooter 没有什么具体作用,不做详细解释。
3.2 Chunk
一个 ChunkGroup 中包含了多个 Chunk,它代表了测点数据(逻辑概念上的某一类数据的集合,如体温数据),在 IoTDB 中称为 Measurement。
在实际文件中 Chunk 是由 ChunkHeader 和多个 Page 组成,并被 1 个字节的分隔符 1
包裹。ChunkHeader中主要保存了当前 Chunk 的数据类型、压缩方式、编码方式、包含的 Pages 占用的字节数等信息。
3.3 Page
一个 Chunk 中包含多个 Page,它是一个数据组织方式,数据大小被限制在 64K 左右。
在实际文件中由 PageHeader 和多个 PageData 组成。
3.4 PageData
一个 Page 中包含了多个 PageData,它包含了两个数组:时间数组和值数组,且这两个数组的下标是对齐的,也就是时间数组中的第一个对应值数组中的第一个。举个例子:
timeArray: [1,2,3,4] valueArray: ['a', 'b', 'c', 'd']
在page中就是这样保存的数据,其中 1 代表了时间 1970-01-01 08:00:00 后的 1 毫秒,对应的值就是 'a'。
数据块展示
时间戳 | 人名 | 体温 | 心率 |
---|---|---|---|
1580950800 | 王五 | 36.7 | 100 |
1580950911 | 王五 | 36.6 | 90 |
POSITION| CONTENT -------- ------- 0| [magic head] TsFile 6| [version number] 000002 // 因为 6个字节的magic + 6个字节的 version 所以 chunkGroup 从 12 开始 ||||||||||||||||||||| [Chunk Group] of wangwu begins at pos 12, ends at pos 253, version:0, num of Chunks:2 // 这里展示的是 ChunkHeader 中保存的信息 12| [Chunk] of xinlv, numOfPoints:1, time range:[1580950800,1580950800], tsDataType:INT32, [minValue:100,maxValue:100,firstValue:100,lastValue:100,sumValue:100.0] | [marker] 1 // chunk 的真正开始是从这个分隔符 1 开始的 | [ChunkHeader] // header 的数据在上面展示了 | 1 pages //这里保存的具体数据 | time:1580950800; value:100 // 下一个 chunk 121| [Chunk] of tiwen, numOfPoints:1, time range:[1580950800,1580950800], tsDataType:FLOAT, [minValue:36.7,maxValue:36.7,firstValue:36.7,lastValue:36.7,sumValue:36.70000076293945] | [marker] 1 | [ChunkHeader] | 1 pages | time:1580950800; value:36.7 230| [Chunk Group Footer] | [marker] 0 // chunkFooter 和 chunk 使用 0 作为分隔 | [deviceID] wangwu | [dataSize] 218 | [num of chunks] 2 ||||||||||||||||||||| [Chunk Group] of wangwu ends
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Serverless 的开发者工具建设
本文将介绍 Serverless 生态下的开发者工具,并简述这些工具是如何贯穿开发、调试、测试和部署的生命周期,提升开发者效率的。 由于 Serverless 平台具备弹性扩缩、免运维、按需付费等特点,越来越多的公司和个人开始使用 Serverless 承载项目。但对于开发者而言,Serverless 一定程度上减少了开发难度,可以让我们聚焦业务逻辑进行开发;但同时,由于 Serverless 颠覆了传统的开发模式,从而在相关的开发工具,函数编排组织上也面临着重大挑战。 面向 Serverless 开发的挑战 从一个开发者的角度而言,Serverless 开发和传统的开发方式相比发生了很大的改变。开发者习惯了在本地进行开发,调试,测试和持续集成,持续部署等流程,在面向 Serverless 进行开发时,免不了会有很多疑问: 怎样本地开发一个 Serverless 项目? 怎样对 Serverless 函数进行本地调试? 开发过程中打印的日志是否可以方便的检索并用于 debug? 如何保证本地环境和云端环境的一致? 发布时怎样将多个函数一次性发布到云环境中? 面向 Serverless ...
- 下一篇
走进Cocos Creator游戏开发(第一篇)
前言: 游戏开发从课题到大创: 这个寒假在家没事就在学习Cocos,以前做的游戏都是界面和体验感都比较差,自己对游戏的开发还是挺感兴趣的,在大一下学期的时候我和自己班一个同学(和我同一个土木班转到现在计科班,学习路上的伙伴),我们一起跟了学院的老师做了一个游戏开发的课题,这个老师也专门带游戏开发的项目。我们的这个课题呢,老师要我们用Win32来开发本次课题的游戏,所以大家会发现我半年前的博客就是Win32的学习知识总结。今年老师要我们报名了学校的大创,我们项目成员总共三人,我和他还加了一个土木专业PS大佬,这次我们大创游戏开发就用Cocos Creator来做,我们最后要发布到微信上,自学有一段时间了,和上一次Win32的开发相比,我想说的就是,Cocos的开发简单很多,这个里面很多的效果不需要我们自己去写了,调用一个API函数就好了,做出来的游戏体验感都要好很多,主要Cocos成品能够发布到大多数的平台上,能够在手机上运行。 本来的打算是寒假在家把基本知识学习一遍,然后去学校之后再真正的开发制作,没想到今年由于这个疫情还比较严重,延迟了开学,还不知道什么时候,所以我们也改变了计划,在...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境