天天看點

大資料列式存儲 Parquet 和 ORC 簡介大資料列式存儲

大資料列式存儲

背景

随着大資料 Hadoop/Spark 生态的不斷發展和成熟,TextFile、CSV這些文本格式存儲效率低,查詢速度慢,往往不能很好地滿足大資料系統中存儲和查詢的需求,列式存儲也在大資料社群逐漸興起到成熟。目前,使用比較廣泛的列式存儲主要是 Apache Parquet 和 Apache ORC,Parquet 由谷歌的 Dremel 發展而來,由Twitter 貢獻給社群,ORC 則是由 Hive 的 RC File 發展而來,從Hive項目中獨立出來,二者目前都是比較活躍的列式存儲項目。

什麼是列式存儲

傳統的資料編碼方式是以行為機關進行,列式存儲則是将資料劃分成資料塊,每個資料塊内部按列的方式進行編碼存儲,通過使用列式存儲會有以下好處:

  • 存儲效率更高,因為同一列的資料類型一緻,編碼效率也會更高
  • 查詢效率更高,利用列式存儲的統計資訊,可以跳過大量的資料,減少IO壓力

Parquet 和 ORC的基本對比

大資料列式存儲 Parquet 和 ORC 簡介大資料列式存儲

Parquet 和 ORC的編碼效率對比

什麼是編碼

列式存儲在存儲資料時,為了提高壓縮效率,會進行一些編碼操作,如圖所示。

大資料列式存儲 Parquet 和 ORC 簡介大資料列式存儲

常見的編碼方式

  • Run-length encoding(RLE)
  • Dictionary
  • Bitpacking
  • Zigzag for signed

Parquet 和 ORC編碼對比

大資料列式存儲 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-kit

TPC-DS(Double Version):

https://github.com/hortonworks/hive-testbench

TPCx-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/
大資料列式存儲 Parquet 和 ORC 簡介大資料列式存儲

ORC 的 Integer 編碼實作

ORC Integer 在 0.11 及之前的版本

HIVE在 0.11 及之前的版本的實作比較簡單,隻覆寫了重複值優化的場景,具體格式如圖

大資料列式存儲 Parquet 和 ORC 簡介大資料列式存儲

原始值: 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
  1. 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中國技術社群參與更多直播、讨論

大資料列式存儲 Parquet 和 ORC 簡介大資料列式存儲