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

上一章聊到在車聯網或物聯網中對數據庫的需求,以及 IoTDB 的整體架構,詳情請見:

時序數據庫 Apache-IoTDB 源碼解析之系統架構(二)

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

這一章主要想聊一聊:

  1. 行式存儲、列式存儲的區別
  2. TsFile 的格式

行式與列式存儲的區別

假如我們的邏輯上的數據表格式及數據爲:

時間戳 人名 體溫
1580950800 張三 36.5
1580950800 李四 36.9
1580950800 王五 36.7

那麼他出現在硬盤格式就是:

硬盤行列存儲差異圖

行式數據

在我理解上,行式數據是把邏輯相關的數據在硬盤上放到一起,比如上面的例子,我們可以稱之爲體溫表,所以在邏輯上:時間、人、體溫,就成爲了邏輯上緊密相關的數據。

所以把相關的數據的硬盤上的組織方式也變成連續的,假如我需要取 張三 的數據,那麼當你讀出 R1 文件塊的時候,就是讀出了所有 張三 相關的數據。

列式數據

列式數據在我理解是將物理相關的數據放到一起,比如時間是一類(long 類型)、名字是一類(string 類型)、體溫是一類(float 類型)。當然這種硬盤的組織方式,相比起行式數據庫,在取拼回體溫表的結構的時候,速度就慢了很多,因爲你要分別取 C1、C2、C3 文件塊,然後還要寫個容器往裏 Set()。那麼列式數據存儲方式相比於行式存儲優勢在哪裏呢?

1.1 取數據方式

有一種叫法是只讀投影列,避免查詢無關列的讀取。列式存儲的優勢在於查詢的列數遠小於總屬性數量,就能少讀很多數據。可能讀起來非常繞口,舉個例子:比如我需要查體溫大於 36 度的體溫值,sql : select 體溫 FROM table WHERE 體溫 > 36 。這時候如果是列式存儲只需要讀出 C3 數據塊就可以一次性查到所有數據。而行式數據庫中,則需要讀出 R1、 R2、 R3。在第二章中介紹到物聯網中的時序數據的特點:存量數據非常大,如果遍歷幾百億數據,時間差距明顯就拉開了。

1.2 數據編碼和壓縮

因爲物理相關的數據他們類型相同,可以使用多種多樣的編碼方式,比如 IoTDB 中就提供了 8 種編碼方式,這個不具體聊,等後面章節再說。

我們繼續拿時間列舉例子,我們可以把時間列改造爲差值存儲: 比如 C1 文件塊中先存儲基礎值 1580950800 那麼他後面的數據值只需要存儲 0 就可以,存儲的數字小了,那麼佔用的存儲空間肯定也就小了,當數字特別大且差值比較小的時候,這用編碼方式就非常有意義。當然還有很多好玩兒的編碼方式,歡迎持續關注。

TsFile 文件格式

爲什麼叫 TsFile ?我聽意思應該是作爲 TimeSeriresFile 的縮寫,也就是時序數據文件的意思。 chunk數據格式

這是一個數據被刷入磁盤後的縮減版 TsFile 格式,我們還拿上面的數據舉例,用來直觀的解釋 TsFile 中出現的一些名詞,假如我的數據爲:

時間戳 人名 體溫 心率
1580950800 張三 36.5 70
1580950800 李四 36.9 80
1580950800 王五 36.7 100
1580950911 王五 36.6 90

上面的數據刷新到磁盤上後會對應關係如下: 數據及名詞對應關係

看到這裏應該能理解每個英文名詞的意思:

  1. ChunkGroup 代表了設備(邏輯概念上的一個集合),在 IoTDB 中稱爲 Device。
  2. Chunk 代表了測點數據(邏輯概念上的某一類數據的集合,如體溫數據),在 IoTDB 中稱爲 Measurement。
  3. Page 中存儲的是具體數據,包含一個時間序列、一個值序列。
  4. PageStatistics 是保存的是Page當中數據的預聚合信息。
  5. ChunkStatistics 是保存的是Chunk當中數據的預聚合信息。

ChunkGroup 中包含多個 Chunk,Chunk 中包含多個 Page ,Page 中 包含多個 時間點和數據項

回想上面提到的 SQL : select 體溫 FROM 王五 WHERE 體溫 > 36 , 在 TsFile 中,只要在文件中找到 王五 的 ChunkGroup ,並在 ChunkGroup 中找到 體溫 的 Chunk,然後從第一個 Page 開始遍歷就完成了。

介紹完了 Chunk 和 ChunkGroup 的概念,那麼如果 Chunk 和 ChunkGroup 非常多的時候,TsFile 怎麼來設計才能快速的定位並找到合適的 ChunkGroup 的呢?TsFile 怎樣才能做到損壞時的檢測或者保證傳遞過程的完整性呢?歡迎持續關注。。。

有興趣的朋友可以查看:官方 Github 中的 TsFile 文檔,瞭解更多詳細信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章