大資料列式存儲
背景
随着大資料 Hadoop/Spark 生态的不斷發展和成熟,TextFile、CSV這些文本格式存儲效率低,查詢速度慢,往往不能很好地滿足大資料系統中存儲和查詢的需求,列式存儲也在大資料社群逐漸興起到成熟。目前,使用比較廣泛的列式存儲主要是 Apache Parquet 和 Apache ORC,Parquet 由谷歌的 Dremel 發展而來,由Twitter 貢獻給社群,ORC 則是由 Hive 的 RC File 發展而來,從Hive項目中獨立出來,二者目前都是比較活躍的列式存儲項目。
什麼是列式存儲
傳統的資料編碼方式是以行為機關進行,列式存儲則是将資料劃分成資料塊,每個資料塊内部按列的方式進行編碼存儲,通過使用列式存儲會有以下好處:
- 存儲效率更高,因為同一列的資料類型一緻,編碼效率也會更高
- 查詢效率更高,利用列式存儲的統計資訊,可以跳過大量的資料,減少IO壓力
Parquet 和 ORC的基本對比
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxQ2YzkDMmZWY3YTM4cTOiJWNmRTM0kjMjBTNidjYjZWZxIWMiJDN48CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
Parquet 和 ORC的編碼效率對比
什麼是編碼
列式存儲在存儲資料時,為了提高壓縮效率,會進行一些編碼操作,如圖所示。
常見的編碼方式
- Run-length encoding(RLE)
- Dictionary
- Bitpacking
- Zigzag for signed
Parquet 和 ORC編碼對比
使用TPC資料集的測試結果
分别使用相同的 TPC 資料集進行測試,從壓縮效率上講,資料庫大小越小,壓縮效率越好。這裡 ORC 使用 Zlib 壓縮, Parquet 使用 Gzip 壓縮。
- TPC-BB and TPC-DS Decimal 版本下,ORC 比 Parquet 占用空間節省大約 10%;
- TPC-DS Double版本下,Parquet 的使用的空間節省 2% 左右。
大資料列式存儲 Parquet 和 ORC 簡介大資料列式存儲
TPC-DS(Decimal Version):
https://github.com/cloudera/impala-tpcds-kitTPC-DS(Double Version):
https://github.com/hortonworks/hive-testbenchTPCx-BB:
http://www.tpc.org/tpcx-bb/附:Parquet 和 ORC Encoding的實作細節對比
Parquet 的Integer編碼實作
Parquet 的 Integer的是通過字典的編碼方式存儲的,為了防止字典過大,超過字典上限後,則通過其他方式存儲。
版本 | 預設存儲 | 補充存儲 |
---|---|---|
PARQUET_V1 | 字典 | PLAIN |
PARQUET_V2 | DeltaBinaryPacking |
PARQUET_V1 和 PARQUET_V2 是 Parquet 内部使用的版本,可以通過相應的參數進行選擇。
Parquet 字典的實作
在實際存儲時,資料庫會有大量重複的值,這時字典的效率還是不錯的,不夠,目前的 Parquet實作還有兩個問題
- 字典是明文存儲,沒有編碼,浪費存儲空間;
- 字典編号是使用RLE編碼,但是編碼效率還有提升空間。
大資料列式存儲 Parquet 和 ORC 簡介大資料列式存儲
Parquet 的 DeltaBinaryPacking
Parquet 的 DeltaBinaryPacking 的實作參考了以下部落格,具體的格式如圖。
http://lemire.me/blog/archives/2012/09/12/fast-integer-compression-decoding-billions-of-integers-per-second/ORC 的 Integer 編碼實作
ORC Integer 在 0.11 及之前的版本
HIVE在 0.11 及之前的版本的實作比較簡單,隻覆寫了重複值優化的場景,具體格式如圖
原始值: 6,6,6,6,6,6,13,17
編碼後: 3,0,6,-2,13,17
ORC Integer 在 0.12的版本
HIVE在 0.12之後做了比較好的優化,可以覆寫常見的四種場景,效果也會比較好
- SHORT_REPEAT : Short repeated integer sequences.
- DELTA : Monotonically increasing or decreasing sequences, sequences with fixed delta values or long
- sequences.
- DIRECT : Random integer sequences whose number of bit requirement doesn't vary a lot
-
PATCHED_BASE : Random integer sequences whose number of bit requirement varies beyond a
threshold.
原創文章,如需轉載,請先聯系作者 dapeng.sdp#alibaba-inc.com
歡迎加入Apache Spark中國技術社群參與更多直播、讨論