Iceberg是一種開放的數據湖表格式。您可以借助Iceberg快速地在HDFS或者阿里云OSS上構建自己的數據湖存儲服務,并借助開源大數據生態的Spark、Flink、Hive和Presto等計算引擎來實現數據湖的分析。
核心能力
Apache Iceberg設計初衷是為了解決Hive數倉上云的問題,經過多年迭代已經發展成為云上構建數據湖服務的表格式標準。關于Apache Iceberg的更多介紹,請參見Apache Iceberg官網。
目前Iceberg提供以下核心能力:
基于HDFS或者對象存儲構建低成本的輕量級數據湖存儲服務。
實現主流開源計算引擎入湖和分析場景的完善對接。
完善的ACID語義。
支持行級數據變更能力。
支持歷史版本回溯。
支持高效的數據過濾。
支持Schema變更。
支持分區布局變更。
支持隱式分區(Hidden Partitioning)。
為了便于理解數倉和Iceberg數據湖在系統架構、業務價值和成本方面的差異,選擇了業界流行的Clickhouse實時數倉、Hive離線數倉和Iceberg數據湖三種具體的技術架構,為您進行了對比,詳細信息如下表。
對比項 | 子項目 | 開源Clickhouse實時數倉 | 開源Hive離線數倉 | 阿里云Iceberg數據湖 |
系統架構 | 架構 | 計算存儲一體 | 計算存儲分離 | 計算存儲分離 |
多計算引擎支持 | 不支持 | 支持 | 支持 | |
數據存儲在對象存儲 | 不支持 | 支持不完善 | 支持 | |
數據存儲在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,對于機器學習算法的開發者非常友好。 |