概述
Delta商業(yè)版功能相對完善, 是由Databricks主推其他計(jì)算引擎的優(yōu)先級是弱于Spark的并且付費(fèi), 社區(qū)版是商業(yè)版的簡化, 功能支持沒有商業(yè)版完善, 適合Spark為核心技術(shù)組件的公司.
Hudi同樣緊耦合Spark功能相對比較完善,但是擴(kuò)展性比較差, 使用其他計(jì)算引擎的話開發(fā)工作量較大. 適合Spark為核心技術(shù)組件的公司.
Iceberg設(shè)計(jì)之初就是定位于提供一個開放可擴(kuò)展的表格式, 因此擴(kuò)展性最好, 不和任何計(jì)算引擎強(qiáng)耦合.對Flink的支持度相對完善.目前缺少小文件合并功能, 在upsert的支持度的上代碼可用,但是FlinkSQL方式還有些BUG. 目前社區(qū)正高優(yōu)先級解決.
設(shè)計(jì)初衷
Iceberg: 高性能, 可擴(kuò)展的分析與可靠的數(shù)據(jù)管理
Hudi: 使hadoop具備增量數(shù)據(jù)的upserts特性
Delta: 定位于流批一體的數(shù)據(jù)處理
雖然設(shè)計(jì)初衷不同,但是隨著組件的推廣使用, 各個組件都在補(bǔ)齊最近的短板.
計(jì)算框架耦合度
Delta, Hudi和Spark耦合較緊.
Iceberg側(cè)重于定義一個標(biāo)準(zhǔn)、開放且通用的數(shù)據(jù)組織格式, 不和某一計(jì)算框架耦合較緊.
Schema 變更支持和設(shè)計(jì)
|Schema演進(jìn) (Schema Evolution) | 是否有自定義的Schema
--| --| --
Iceberg | all | 是
Hudi | back-compitable | 否(復(fù)用spark-shema)
Delta | all | 否(復(fù)用spark-shema)
PS: Schema演進(jìn)
表結(jié)構(gòu)變更
- Add - 在表中或是在嵌套結(jié)構(gòu)中新增column
- Drop - 在表中或是在嵌套結(jié)構(gòu)中移除已有的column
- Rename - 在表中或是在嵌套結(jié)構(gòu)中修改column的名字
- Update - 提升數(shù)據(jù)的類型,支持column,struct field,map key,map value和list中的元素
- Reorder - 調(diào)整表中說是嵌套結(jié)構(gòu)中的column順序
Hudi 僅支持添加可選列和刪除列這種向后兼容的 DDL 操作
Iceberg還額外提供 Partition Evolution, Iceberg可以在已有的表上更改分區(qū), 并且該過程是一個操作元數(shù)據(jù)的過程, 不涉及表數(shù)據(jù)移動. 因?yàn)椴樵冋Z句并不直接引用分區(qū)值.
并發(fā)控制及數(shù)據(jù)變更
| 并發(fā)控制機(jī)制 | 數(shù)據(jù)變更方式 | |
|---|---|---|
| Iceberg | 樂觀鎖 | COW |
| Hudi | 樂觀鎖 | COW |
| Delta | 樂觀鎖/MVCC | COW/MOR |
PS1: 并發(fā)控制
多版本并發(fā)控制(MVCC)是一種用來解決讀-寫沖突的無鎖并發(fā)控制,也就是為事務(wù)分配單向增長的時間戳,為每個修改保存一個版本,版本與事務(wù)時間戳關(guān)聯(lián),讀操作只讀該事務(wù)開始前的數(shù)據(jù)庫的快照。 這樣在讀操作不用阻塞寫操作,寫操作不用阻塞讀操作的同時,避免了臟讀和不可重復(fù)讀
樂觀并發(fā)控制(OCC)是一種用來解決寫-寫沖突的無鎖并發(fā)控制,認(rèn)為事務(wù)間爭用沒有那么多,所以先進(jìn)行修改,在提交事務(wù)前,檢查一下事務(wù)開始后,有沒有新提交改變,如果沒有就提交,如果有就放棄并重試。樂觀并發(fā)控制類似自選鎖。樂觀并發(fā)控制適用于低數(shù)據(jù)爭用,寫沖突比較少的環(huán)境
PS2: COW(Copy On Write), MOR(Merge On Read)
在實(shí)時場景下, 行級(Row-level)的更新刪除,通常有兩種方案,及寫時復(fù)制(COW)和讀時合并(MOR). 其中寫時復(fù)制(COW)在方式在寫文件的時候就做了數(shù)據(jù)合并,因此寫入數(shù)據(jù)的壓力比較大, 對讀數(shù)據(jù)比較友好. 適合大量讀的場景, 實(shí)時性較低. 而讀時合并(MOR)則是在讀數(shù)據(jù)的時候合并, 寫入是數(shù)據(jù)采用append的方式,適合快速寫入的場景, 實(shí)時性較高.
接口抽象程度和插件化
| 寫計(jì)算引擎是否可插拔 |讀計(jì)算引擎是否可插拔 |數(shù)據(jù)存儲組件是否可插拔 |文件格式是否可選
--|--|--|--|--
Iceberg | 是 |是 |是 |是
Hudi | 否(綁定了spark) |是 | 是 |是
Delta | 否(綁定了spark) |是 |是 |是
Iceberg 是抽象程度做得最好的數(shù)據(jù)湖方案, 做了非常干凈的解耦.
事物支持(ACID)和隔離級別支持
| 是否支持事務(wù) | 隔離級別 | 是否支持?jǐn)?shù)據(jù)回溯回滾(Time travel)
--|--|--|--
Iceberg | 是 | Write Serialization | 是
Hudi | 是 | Snapshot Isolation | 是
Delta | 是 | Serialization
Write Serialization
Snapshot Isolation | 是
PS1: 事物的四個特性:
原子性: Atomicity, 一致性: Consistency, 隔離性: Isolation, 持久性: Durability
PS2: 隔離級別含義
- Serialization: 所有的讀寫操作必須串行
- Write Serialization: 寫操作之間必須穿行, 讀寫操作之間可以并行
- Snapshot Isolation: 寫操作無交集則可并行,否則串行. 讀寫操作之間可以并行
Snapshot Isolation 的隔離級別對并發(fā)性的支持相對較好
PS3: 數(shù)據(jù)回溯回滾(Time travel)
用戶查詢具體時間點(diǎn)的數(shù)據(jù)快照或者回滾錯誤的數(shù)據(jù)更新