深度對比Apache CarbonData、Hudi和Open Delta三大開源數(shù)據(jù)湖方案
背景
我們已經(jīng)看到,人們更熱衷于高效可靠的解決方案,擁有為數(shù)據(jù)湖提供應(yīng)對突變和事務(wù)處理的能力。在數(shù)據(jù)湖中,用戶基于一組數(shù)據(jù)生成報(bào)告是非常常見的。隨著各種類型的數(shù)據(jù)匯入數(shù)據(jù)湖,數(shù)據(jù)的狀態(tài)不會一層不變。需要改變各種數(shù)據(jù)的用例包括隨時間變化的時序數(shù)據(jù)、延遲到達(dá)的時延數(shù)據(jù)、平衡實(shí)時可用性和回填、狀態(tài)變化的數(shù)據(jù)(如CDC)、數(shù)據(jù)快照、數(shù)據(jù)清理等,在生成報(bào)告時,這些都將被寫入/更新在同一組表。
由于Hadoop分布式文件系統(tǒng)(HDFS)和對象存儲類似于文件系統(tǒng),因此它們不是為提供事務(wù)支持而設(shè)計(jì)的。在分布式處理環(huán)境中實(shí)現(xiàn)事務(wù)是一個具有挑戰(zhàn)性的問題。例如,日??紤]到鎖定對存儲系統(tǒng)的訪問,這會以犧牲整體吞吐量性能為代價(jià)。像Apache CarbonData、OpenDelta Lake、Apache Hudi等存儲解決方案,通過將這些事務(wù)語義和規(guī)則推送到文件格式本身或元數(shù)據(jù)和文件格式組合中,有效地解決了數(shù)據(jù)湖的ACID需求。
很多用戶看到這三種主要解決方案時,將陷入兩難的境地,在不同情況下不知怎么選擇?今天我們對比了三大方案,幫助用戶更好的根據(jù)自己的場景選擇解決方案。
Apache Hudi
Apache Hudi是Uber為滿足內(nèi)部數(shù)據(jù)分析需求而設(shè)計(jì)的項(xiàng)目。快速upsert/delete和compaction功能可以解決許多實(shí)時用例。該項(xiàng)目在Apache社區(qū)非常活躍,2020年4月取得了最高項(xiàng)目地位。
從Hudi的名字就能看出他的設(shè)計(jì)目標(biāo), Hadoop Upserts Deletes and Incrementals,主要支持Upserts、Deletes和增量數(shù)據(jù)處理。其關(guān)鍵特性如下:
1.文件管理
Hudi在DFS上將表組織為basepath下的目錄結(jié)構(gòu)。表被劃分為分區(qū),這些分區(qū)是包含該分區(qū)的數(shù)據(jù)文件的文件夾,類似于Hive表。
2.索引
Hudi通過索引機(jī)制將給定的HoodieKey(記錄鍵+分區(qū)路徑)一致地映射到文件id,從而提供高效的upserts。
3.表類型
Hudi支持的表類型如下:
- 寫入時復(fù)制:使用專有的列文件格式(如parquet)存儲數(shù)據(jù)。在寫入時執(zhí)行同步合并,只需更新版本并重寫文件。
- 讀取時合并:使用列(如parquet) +行(如Avro)文件格式的組合存儲數(shù)據(jù)。更新記錄到增量文件,并隨后壓縮以同步或異步生成列文件的新版本。
4.查詢類型
Hudi支持三種查詢類型:
- 快照查詢:查詢是在給定的提交或壓縮操作之后對表進(jìn)行快照的請求。利用快照查詢時,copy-on-write表類型僅公開最新文件切片中的基/列文件,并保證相同的列查詢性能。
- 增量查詢:對于寫入時復(fù)制表,增量查詢提供自給定提交或壓縮后寫入表的新數(shù)據(jù),提供更改流以啟用增量數(shù)據(jù)管道。
- 讀取優(yōu)化查詢:查詢查看指定提交/壓縮操作后表的最新快照。只暴露最新文件版本的base/columnar文件,保證列查詢性能與非Hudi列表相同。僅在讀取表合并時支持
5.Hudi工具
Hudi由不同的工具組成,用于將不同數(shù)據(jù)源的數(shù)據(jù)快速采集到HDFS,作為Hudi建模表,并與Hive元存儲進(jìn)一步同步。工具包括:DeltaStreamer、Hoodie-Spark的Datasource API、HiveSyncTool、HiveIncremental puller。
Apache CarbonData
Apache CarbonData是三個產(chǎn)品中最早的,由華為貢獻(xiàn)給社區(qū),助力華為云產(chǎn)品的數(shù)據(jù)平臺和數(shù)據(jù)湖解決方案應(yīng)對PB級負(fù)載。這是一個雄心勃勃的項(xiàng)目,將許多能力都集中在一個項(xiàng)目中。除了支持更新、刪除、合并操作、流式采集外,它還擁有大量高級功能,如時間序列、物化視圖的數(shù)據(jù)映射、二級索引,并且還被集成到多個AI平臺,如Tensorflow。
CarbonData沒有 HoodieKey 設(shè)計(jì),不強(qiáng)調(diào)主鍵。更新/刪除/合并等操作通過優(yōu)化的粒度連接實(shí)現(xiàn)。CarbonData與Spark緊密集成,在CarbonData層中有很多優(yōu)化,比如數(shù)據(jù)跳躍、下推等。在查詢方面,CarbonData支持Spark、Hive、Flink、TensorFlow、pyTorch和Presto。一些關(guān)鍵特性包括:
1.查詢加速
諸如多級索引、壓縮和編碼技術(shù)等優(yōu)化旨在提高分析查詢的性能,這些查詢可能包括過濾器、聚合和用戶期望PB級數(shù)據(jù)的點(diǎn)查詢響應(yīng)時間亞秒級。高級下推優(yōu)化與Spark深度集成,確保計(jì)算在靠近數(shù)據(jù)處執(zhí)行,以最小化數(shù)據(jù)讀取、處理、轉(zhuǎn)換和傳輸?shù)臄?shù)量。
2.ACID:數(shù)據(jù)一致性
沒有關(guān)于故障的中間數(shù)據(jù),按快照隔離工作,分離讀取和寫入。對數(shù)據(jù)(查詢、IUD【插入更新刪除】、索引、數(shù)據(jù)映射、流式處理)的每個操作均符合ACID標(biāo)準(zhǔn)。支持使用基于列和行的格式進(jìn)行近實(shí)時分析,以平衡分析性能和流式采集以及自動切換。
3.一份數(shù)據(jù)
通過集成Spark、Hive、Presto、Flink、Tensorflow、Pytorch等多種引擎。數(shù)據(jù)湖解決方案現(xiàn)在可以保留一個數(shù)據(jù)副本。
4.各種優(yōu)化指標(biāo)
其他索引,如二級索引、Bloom、Lucene、Geo-Spatial、實(shí)體化視圖,可以加速點(diǎn)、文本、聚合、時間序列和Geo空間查詢。通過Polygon UDF,CarbonData支持地理空間數(shù)據(jù)模型。
5.更新和刪除
支持合并、更新和刪除操作,以啟用諸如更改-數(shù)據(jù)-捕獲、緩慢更改-維(SCD-2)操作等復(fù)雜用例。
6.高擴(kuò)展性
Scale存儲和處理分離,也適用于云架構(gòu)。分布式索引服務(wù)器可以與查詢引擎(如spark, presto)一起啟動,以避免跨運(yùn)行重新加載索引,并實(shí)現(xiàn)更快和可擴(kuò)展的查找。
Delta【開源】
Delta Lake項(xiàng)目于2019年通過Apache License開放源碼,是Databricks解決方案的重要組成部分。Delta定位為數(shù)據(jù)湖存儲層,集成流式和批處理,支持更新/刪除/合并。為Apache Spark和大數(shù)據(jù)工作負(fù)載提供ACID事務(wù)能力。一些關(guān)鍵特性包括:
1.ACID事務(wù)
Delta Lake將ACID事務(wù)帶到您的數(shù)據(jù)湖中。Delta Lake存儲一個事務(wù)日志,以跟蹤對表目錄所做的所有提交,以提供ACID事務(wù)。它提供可串行化的隔離級別,確保數(shù)據(jù)在多個用戶之間的一致性。
2.方案管理與執(zhí)行
Delta Lake利用Spark分布式處理能力處理所有元數(shù)據(jù),通過提供指定模式和幫助實(shí)施模式的能力,避免不良數(shù)據(jù)進(jìn)入數(shù)據(jù)湖。它通過提供合理的錯誤消息來防止不良數(shù)據(jù)進(jìn)入系統(tǒng),甚至在數(shù)據(jù)被集成到數(shù)據(jù)湖之前就進(jìn)入系統(tǒng),從而防止數(shù)據(jù)損壞。
3.數(shù)據(jù)版本控制和時間旅行
將對數(shù)據(jù)湖中的數(shù)據(jù)進(jìn)行版本控制,并提供快照,以便您可以像該快照是系統(tǒng)當(dāng)前狀態(tài)一樣查詢它們。這有助于我們恢復(fù)到舊版本的數(shù)據(jù)湖中進(jìn)行審計(jì)、回滾和類似的操作。
4.開放格式
Delta Lake 中的所有數(shù)據(jù)都以Apache Parquet格式存儲,使得Delta Lake能夠利用Parquet本地的高效壓縮和編碼方案。
5.統(tǒng)一的批量流式sink
近似實(shí)時分析。Delta Lake中的表既是一個批處理表,也是流源和sink,為Lambda架構(gòu)提供了一個解決方案,但又向前邁進(jìn)了一步,因?yàn)榕幚砗蛯?shí)時數(shù)據(jù)都下沉在同一個sink中。
與CarbonData類似,Delta不強(qiáng)調(diào)主鍵,因此更新/刪除/合并都是基于spark的連接函數(shù)實(shí)現(xiàn)的。在數(shù)據(jù)寫入方面,Delta和Spark是強(qiáng)綁定關(guān)系。與Spark的深度集成可能是最好的特性,事實(shí)上,它是唯一一個具有Spark SQL特定命令(例如:MERGE),它還引入了有用的DML,如直接在Spark中更新WHERE或DELETE WHERE。Delta Lake不支持真正的數(shù)據(jù)血緣關(guān)系(即跟蹤數(shù)據(jù)何時以及如何在Delta Lake中復(fù)制數(shù)據(jù)的能力),但是有審計(jì)和版本控制(在元數(shù)據(jù)中存儲舊模式)。
最后
Hudi在IUD性能和讀取合并等功能方面具有競爭優(yōu)勢。例如,如果您想知道是否要與Flink流一起使用,那么它目前不是為這樣的用例設(shè)計(jì)的。Hudi Delta Streamer支持流式數(shù)據(jù)采集。這里的“流式處理”實(shí)際上是一個連續(xù)的批處理周期。但從本質(zhì)上講,這仍不是一種存粹的流式的采集。該社區(qū)由Uber提供,并已開放其所有功能。
Delta的主要優(yōu)勢之一是它能夠與Spark集成,特別是其流批一體化設(shè)計(jì)。Delta擁有良好的用戶API和文檔。該社區(qū)由Databricks提供,它擁有一個具有附加功能的商用版本。
CarbonData是市場上最早的產(chǎn)品,由于物化視圖、二級索引等先進(jìn)的索引,它具有一定的競爭優(yōu)勢,并被集成到各種流/AI引擎中,如Flink、TensorFlow,以及Spark、Presto和Hive。社區(qū)由華為提供,所有特性均已開源。
隨著新版的發(fā)布,這三個都在不斷填補(bǔ)他們?nèi)笔У哪芰?,并可能在未來相互融合或競爭。?dāng)然,也可以把重點(diǎn)放在自己的情景上,構(gòu)建自身優(yōu)勢的門檻。對這些解決方案進(jìn)行性能比較有助于更好地了解它們的產(chǎn)品。因此,勝負(fù)仍是未知之?dāng)?shù)。
下表從多個維度總結(jié)了這三者。需要注意的是,本表所列能力僅突出2020年8月底的能力。
特性對比表
社區(qū)現(xiàn)狀(截至2020年8月)