解決方案
在 Hadoop 上進行分析時是逐列讀取記錄,因此一個只需要某個薪資欄位的查詢,仍會拉出每位員工的整筆記錄,而異質記錄的壓縮效果很差。Twitter 自家的資料集巢狀層級深達七層,葉節點超過 80 個。
Twitter 與 Cloudera 打造了 Parquet,這是一種供 Hadoop 使用的開源欄式儲存格式。它不寫入列,而是寫入欄:先寫入所有姓名,再寫入所有年齡,然後寫入所有薪資。它的一大成就在於運用 Google Dremel 的記錄切碎演算法與共用的編碼規格,把巢狀資料切分為欄。
由於一個欄只存放一種型別,通用壓縮與型別專屬壓縮都能獲得改善,而查詢引擎會跳過載入它不需要的欄。自動字典編碼加上位元打包與遊程編碼則縮小了其餘部分。Parquet 不把使用者綁定到任何序列化函式庫,因此許多引擎都採用它。
Parquet 1.0 於 2013 年 7 月推出,貢獻者來自 Twitter、Cloudera、Criteo、Berkeley AMPLab 與 Stripe,而它當時已在 Twitter 的生產環境中運行。
達成了什麼
以欄為單位儲存,讓分析能跳過不需要的部分
為何奏效
同質的欄值壓縮效果遠優於混合的列,因此檔案變得小得多。
查詢只載入所需的欄,因此 I/O 與成本大幅下降。
透過 Dremel 切分巢狀資料,意味著複雜的結構定義仍能套用欄式儲存。
不綁定特定框架,讓每個引擎都能採用而不必改寫。
可套用之處
當瓶頸在於讀取與壓縮時,改變實體配置而非邏輯:把同質的值放在一起,能讓昂貴的 I/O 縮減,檔案也免費變得更小。
後續發展
Parquet 1.0 於 2013 年 7 月推出,迅速成為 Hadoop 與 Spark 生態系中的預設欄式格式,之後也進入資料湖、lakehouse 與雲端資料倉儲。它如今是支援最廣泛的開放儲存格式之一,凡分析需要對寬表進行快速、便宜的掃描之處,都會用到它。
追溯依據
參考來源
- Announcing Parquet 1.0: Columnar Storage for Hadoop Twitter Blog · web.archive.org ·
- Parquet Format Specification Apache Parquet · apache.googlesource.com