Apache CarbonData :一種為更加快速資料分析而生的新Hadoop檔案版式
阿新 • • 發佈:2019-02-09
用例和動機:為什麼介紹一種新的檔案格式?
用例: 順序掃描
- 全表掃描
- 大掃描(全行, 沒過濾)
- 只獲取表的幾列作為查詢結果
- 通常的使用場景:
- ETL工作
- 日誌分析
用例:隨機訪問
- 在很多列進行過濾(點查詢)
- 行鍵值查詢 (比如HBase)
- 窄掃描但可能要獲取所以列
- 要求秒/亞秒級別的低延遲
- 通常的使用場景:
- 操作查詢
- 使用者分析
用例:OLAP類查詢
- 任意範圍的互動資料分析
- 包括聚合/join
- Roll-up, Drill-down, Slicing and Dicing
- 低延遲的點對點查詢
- 通常的使用場景:
- 儀器報表
- 詐騙&點對點分析
動機
為什麼需要CarbonData
基於以下需求,我們研究Hadoop生態系統中現有的檔案格式,但是我們不能找到一個同時滿足所有需求的合適的方法,所以我們開始設計CarbonData。
- 支援廣掃描& 少列結果
- 支援在亞秒級響應主鍵查詢
- 支援大資料上涉及一個查詢中有許多過濾的互動OLAP類查詢, 並能以秒級響應
- 支援包含全列的單條記錄的快速抽取
- 支援HDFS以便使用者可以管理正存在的Hadoop叢集
當我們研究Parquet/ORC,它們似乎在R1和R5上表現很好,但是對於R2,R3,R4則不然。所以我們設計CarbonData主要增加以下不同的特性:
- 帶索引的資料儲存:它可以顯著的提高查詢效能,並且當查詢中有過濾條件,可以減少I/O掃描與CPU資源開銷。CarbonData索引包括多個級別,處理框架可以通過這個索引來減少它需要排程和處理的任務。它也可以在一個更加高效的單元(叫做blocklet)裡面跳躍掃描,而不用掃描整個檔案。
- 可操作的編碼過的資料:通過支援高效的壓縮和全域性編碼設計,使得可以在已經壓縮/編碼過的資料上進行查詢。資料可以僅當返回結果給使用者的時候才修改,即“惰性實現”。
- 列組:允許多列組成一個列組,並以行格式進行儲存。這減少了查詢時的行重建的開銷。
- 用一種資料格式支援多種用例:如互動OLAP類查詢,順序查詢(廣掃描),隨機訪問(窄掃描)。
設計目標
- 多種資料訪問型別的低延遲
- 允許壓縮編碼過資料上的快速查詢
- 確保空間高效性
- Hadoop生態系統上可行的通用格式
- 讀最優化的列式儲存
- 利用多級索引實現低延遲
- 支援利用列組來獲得基於行的有點
- 能夠對聚合的延遲解碼進行字典編碼
- 貫穿整個廣泛的Hadoop生態體系
深入CarbonData檔案格式
CarbonData檔案結構
- Blocklet:一個包含列式儲存中的多行的集合
- Column chunk:在一個Blocklet中一列/列組的資料
- 允許多列組成一個列組&以行格式進行儲存
- 列資料以有序索引儲存
- Footer:元資料資訊
- 檔案級別的元資料&統計資訊
- 表資訊
- Blocklet索引&Blocklet級別元資料
一個CarbonData檔案是一個HDFS塊。
版式
![這裡寫圖片描述](https://img-blog.csdn.net/20160726142453559)Blocklet
- 資料根據多維鍵值(MDK)排序
- 在列存中資料以索引儲存
例子:
原始表
編碼
對每列的取值進行Hash,如(QTR1->1),(QTR2->2),……
MDK排序
Blocklet邏輯結構圖
檔案級別Blocklet索引
- 建立用於過濾的記憶體中的檔案級別MDK索引
為高效掃描做的主要優化
倒排索引
- 在column chunk選擇性的將列資料儲存為倒排索引
- 取值種類少的列壓縮效果更加好
- 利於快速判斷過濾
例子:
Blocklet
我們需要對每個維度按照鍵值進行排序,但是還要知道每個值原來的行號。所以我們把每個鍵值map成[值,行號],然後對每個維度按照鍵值進行排序。
倒排索引
Blocklet物理結構圖
- d列儲存內容:值,該行開始往後,有幾行都是存這個值
- r列儲存內容:值,該行開始往後,有幾行都是順序增1的