Iceberg是一種開放的資料湖表格式。您可以藉助Iceberg快速地在HDFS或者阿里雲OSS上構建自己的資料湖儲存服務,並藉助開源巨量資料生態的Spark、Flink、Hive和Presto等計算引擎來實現資料湖的分析。
核心能力
Apache Iceberg設計初衷是為瞭解決Hive數倉上雲的問題,經過多年迭代已經發展成為雲上構建資料湖服務的表格式標準。關於Apache Iceberg的更多介紹,請參見Apache Iceberg官網。
目前Iceberg提供以下核心能力:
基於HDFS或者Object Storage Service構建低成本的輕量級資料湖儲存服務。
實現主流開源計算引擎入湖和分析情境的完善對接。
完善的ACID語義。
支援行級資料變更能力。
支援歷史版本回溯。
支援高效的資料過濾。
支援Schema變更。
支援分區布局變更。
支援隱式分區(Hidden Partitioning)。
為了便於理解數倉和Iceberg資料湖在系統架構、業務價值和成本方面的差異,選擇了業界流行的Clickhouse即時數倉、Hive離線數倉和Iceberg資料湖三種具體的技術架構,為您進行了對比,詳細資料如下表。
對比項 | 子專案 | 開源Clickhouse即時數倉 | 開源Hive離線數倉 | 阿里雲Iceberg資料湖 |
系統架構 | 架構 | 計算儲存一體 | 計算儲存分離 | 計算儲存分離 |
多計算引擎支援 | 不支援 | 支援 | 支援 | |
資料存放區在Object Storage Service | 不支援 | 支援不完善 | 支援 | |
資料存放區在HDFS | 不支援 | 支援 | 支援 | |
儲存格式開放性 | 不開放 | 開放 | 開放 | |
業務價值 | 時效性 | 秒級 | 小時級/天級 | 分鐘級 |
計算靈活性 | 低 | 強 | 強 | |
事務性 | 不支援 | 不完善 | 支援 | |
表級語義通用性 | 差 | 差 | 優秀 | |
行級資料變更 | 不支援 | 支援較弱 | 支援 | |
資料品質 | 非常高 | 較高 | 較高 | |
維護成本 | 查詢效能 | 高 | 較高 | 較高 |
儲存成本 | 非常高 | 一般 | 低 | |
自助服務 | 不支援 | 不支援 | 支援 | |
資源彈性 | 一般 | 一般 | 優秀 |
與開源Iceberg對比
從基礎功能、資料變更和計算引擎等方面,對比了阿里雲Iceberg與開源Iceberg,詳細資料如下表。
“√”表示支援,“x”表示暫未支援。
類別 | 專案 | 子專案 | 開源Iceberg | Iceberg商業版(阿里雲) |
基礎功能 | ACID | 無 | √ | √ |
歷史版本回溯 | 無 | √ | √ | |
Source和Sink整合 | Batch | √ | √ | |
Streaming | √ | √ | ||
高效資料過濾 | 無 | √ | √ | |
資料變更 | Schema Evolution | 無 | √ | √ |
Partition Evolution | 無 | √ | √ | |
CopyOnWrite更新 | 無 | √ | √ | |
MergeOnRead更新 | Read | √ | √ | |
Write | √ | √ | ||
Compaction | x | x | ||
計算引擎 | Apache Spark | 讀取 | √ | √ |
寫入 | √ | √ | ||
Apache Hive | 讀取 | √ | √ | |
寫入 | √ | √ | ||
Apache Flink | 讀取 | √ | √ | |
寫入 | √ | √ | ||
PrestoDB或Trino | 讀取 | √ | √ | |
寫入 | √ | √ | ||
程式設計語言 | Java | 無 | √ | √ |
Python | 無 | √ | √ | |
進階功能 | 原生接入阿里雲OSS | 無 | x | √ |
原生接入阿里雲DLF | 無 | x | √ | |
本機資料緩衝加速 | 無 | x | √ | |
自動合并小檔案 | 無 | x | √ |
以上資訊是在2021年9月份,客觀分析開源Iceberg和商業版Iceberg現狀之後制定的表格。隨著後續版本的不斷迭代升級,對比項狀態可能發生變化。
適用情境
Iceberg作為通用資料湖解決方案中最核心的組件之一,主要適用於以下情境。
情境 | 描述 |
即時資料匯入和查詢 | 資料即時從上遊流入Iceberg資料湖,查詢側即可查詢該資料。例如,在日誌情境中,啟動Iceberg或Spark流作業,即時地將日誌資料匯入Iceberg表中,然後可以使用Hive、Spark、Iceberg或Presto進行即時查詢。同時,由於Iceberg支援ACID,保證了資料的流入和查詢的隔離性,不會產生髒資料。 |
刪除或更新資料 | 大部分數倉都難以實現較為高效的行級資料刪除或更新,通常需要啟動離線作業把整個表未經處理資料讀取出來,然後變更資料後,寫入到一個原始表。而Iceberg成功把變更的範圍從表層級縮小到了檔案層級,從而可以通過局部變更來完成商務邏輯的資料變更或刪除。 在Iceberg資料湖中,您可以直接通過執行類似命令 |
資料品質控制 | 藉助於Iceberg Schema的校正功能,在資料匯入時剔除異常資料,或者對異常資料做進一步處理。 |
資料Schema變更 | 資料的Schema並非固定不變,Iceberg支援通過Spark SQL的DDL陳述式完成表結構變更。 Iceberg在變更表結構的時候,歷史資料並不需要全部重新按照新的Schema匯出一份,從而使得Schema變更的速度非常快。同時,由於Iceberg支援ACID,有效地隔離了Schema變更對現有讀取任務的影響,從而使得您可以讀取到結果一致的資料。 |
即時機器學習 | 通常在機器學習情境中,需要花費大量的時間處理資料,例如,資料清洗、轉換和提取特徵等,還需要對歷史資料和即時資料進行處理。而Iceberg簡化了工作流程,整個資料處理過程是一條完整的、可靠的即時資料流,其資料的清洗、轉換和特徵化等操作都是流上的節點動作,無需處理歷史資料和即時資料。此外,Iceberg還支援原生的Python SDK,對於機器學習演算法的開發人員非常友好。 |