Delta, Hudi, Iceberg對比

概述

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: 隔離級別含義

  1. Serialization: 所有的讀寫操作必須串行
  2. Write Serialization: 寫操作之間必須穿行, 讀寫操作之間可以并行
  3. Snapshot Isolation: 寫操作無交集則可并行,否則串行. 讀寫操作之間可以并行
    Snapshot Isolation 的隔離級別對并發(fā)性的支持相對較好

PS3: 數(shù)據(jù)回溯回滾(Time travel)

用戶查詢具體時間點(diǎn)的數(shù)據(jù)快照或者回滾錯誤的數(shù)據(jù)更新

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容