時序數據庫 Apache-IoTDB 源碼解析之文件數據塊(四)

上一章聊到行式存儲、列式存儲的基本概念,並介紹了 TsFile 是如何存儲數據以及基本概念。詳情請見:git

時序數據庫 Apache-IoTDB 源碼解析之文件格式簡介(三)github

打一波廣告,歡迎你們訪問IoTDB 倉庫,求一波 Star 。歡迎關注頭條號:列炮緩開局,歡迎關注OSCHINA博客數據庫

這一章主要想聊一聊:apache

  1. TsFile的文件概覽
  2. TsFile的數據塊

TsFile文件概覽

文件概覽

一個完整的 TsFile 是由圖中的幾大塊組成,圖中的數據塊與索引塊之間使用 1 個字節的分隔符 2 來進行分隔,對於分隔符不作過多解釋,校驗和保證數據有效性。windows

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 。.net

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。3d

在實際的文件中,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
相關文章
相關標籤/搜索