时序数据库ApacheIoTDB源码解析之文件数据块(四)

database

时序数据库 Apache-IoTDB 源码解析之文件格式简介(三)

打一波广告,欢迎大家访问IoTDB 仓库,求一波 Star 。欢迎关注头条号:列炮缓开局,欢迎关注OSCHINA博客

这一章主要想聊一聊:

  1. TsFile的文件概览
  2. 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

以上是 时序数据库ApacheIoTDB源码解析之文件数据块(四) 的全部内容, 来源链接: utcz.com/z/532220.html

回到顶部