基于Hadoop生態系統的一種高性能數據存儲格式CarbonData(基礎篇)
背景
大數據時代,企業數據爆發式增長,如國內某企業平均每天有300億筆業務,業務高峰期間每天可達600億筆業務。隨著數據的與日俱增,業務驅動下的數據分析靈活性要求越來越高,不同場景的數據分不同業務系統而構建,導致存儲冗余嚴重,缺乏高效、統一的融合數據分析。
業界大數據分析方案,每種技術都只能解決某種場景下的訴求,不能同時滿足多場景的應用,例如:MPP數據庫,SQL語法支持好,小數據量下通過并行計算性能高,但支持萬億數據規模困難,不能有效與Hadoop生態集成,數據不能與其他大數據組件共享存儲;搜索類技術提升了性能,但是數據膨脹很大,不支持標準的SQL,不兼容老業務。
Apache CarbonData是一種高性能大數據存儲方案,與Hadoop、Spark等大數據生態組件無縫集成。針對當前大數據領域分析場景需求各異而導致的存儲冗余問題,CarbonData提供了一種新的融合數據存儲方案,以一份數據同時支持多種應用場景,并通過多級索引、字典編碼、預聚合、動態Partition、準實時數據查詢等特性提升了IO掃描和計算性能,實現萬億數據分析秒級響應。
1.架構原理
設計思路:
- 往下生態:與Hadoop HDFS(Hadoop是當前大數據生態的代名詞)無縫集成,一個CarbonData文件就是一個HDFS數據塊,充分利用HDFS的分布式,三份數據備份的可靠性等。
- 往上生態:與Spark做深度集成,充分利用Spark生態(當前業界***的計算引擎),支持標準SQL查詢,Dataframe數據分析,支持機器學習等。隨著CarbonData的用戶越來越多,為了增強CarbonData的生態連接性,后續陸續支持了與Presto、Hive集成(Alpha特性)。
- 如何做到一份數據快速查詢:利用多種索引(MDK,MinMax,倒排),快速找到目標數據,具體原理如下圖:
首先找到符合查詢條件的CarbonData文件;如上圖,***了2個文件,則啟動兩個Spark Task去讀數據塊(即 文件),在CarbonData文件里進一步細分成多個Blocklet,在Blocklet里又進一步細分成Page。
數據格式:
- 數據布局:
Block:一個hdfs文件,默認1G,可配置
Blocklet:文件內的列存數據塊,是最小的IO讀取單元
Column Chunk:在一個Blocklet中一列/列組的數據
Pages:Column Chunk內的數據頁,是最小的解碼單元
- 元數據信息:
Header:Version,Schema
Footer:BlockletOffset,Index & 文件級統計信息
- 內置索引和統計信息:
Blocklet索引:B Tree startKey, endKey
Blocklet級和Page級統計信息:min,max等
上圖為CarbonData內部的文件格式,有File-header、有File-footer、有記錄元數據中心,包括schema數據、偏移量數據等。我們重點看一下中間的Blocklet內容。Blocklet是數據文件內的一個列存數據塊。Blocklet內部按列存儲,比如說有column1_chunk、colume2_chunk,每一列數據又分為Page,Page是最小的解碼單元。另外一個特點是除了元數據信息以外,還有索引信息。索引信息被統一存在File-footer內,它包括了Blocklet的索引,即主索引,它是一棵B樹,里面包含了start_key和end_key之間的范圍值。同時也包括 Blocklet級和Page級統計信息,這些統計信息是非常有用的,通過這些信息可以跳過 Blocklet和Page,避免不必要的 IO 和解碼。
2.安裝部署
CarbonData安裝部署非常簡單,可以參考社區文檔:
https://github.com/apache/carbondata/blob/master/docs/quick-start-guide.md
https://github.com/apache/carbondata/blob/master/docs/installation-guide.md