Apache Hudi 在袋鼠云數(shù)據(jù)湖平臺的設(shè)計與實踐
在大數(shù)據(jù)處理中,實時數(shù)據(jù)分析是一個重要的需求。隨著數(shù)據(jù)量的不斷增長,對于實時分析的挑戰(zhàn)也在不斷加大,傳統(tǒng)的批處理方式已經(jīng)不能滿足實時數(shù)據(jù)處理的需求,需要一種更加高效的技術(shù)來解決這個問題。Apache Hudi(Hadoop Upserts Deletes and Incremental Processing)就是這樣一種技術(shù),提供了高效的實時數(shù)據(jù)倉庫管理功能。
本文將介紹袋鼠云基于 Hudi 構(gòu)建數(shù)據(jù)湖的整體方案架構(gòu)及其在實時數(shù)據(jù)倉庫處理方面的特點,并且為大家展示一個使用 Apache Hudi 的簡單示例,便于新手上路。
Apache Hudi 介紹
Apache Hudi 是一個開源的數(shù)據(jù)湖存儲系統(tǒng),可以在 Hadoop 生態(tài)系統(tǒng)中提供實時數(shù)據(jù)倉庫處理功能。Hudi 最早由 Uber 開發(fā),后來成為 Apache 頂級項目。
Hudi 主要特性
· 支持快速插入和更新操作,以便在數(shù)據(jù)倉庫中實時處理數(shù)據(jù);
· 提供增量查詢功能,可有效提高數(shù)據(jù)分析效率;
· 支持時間點查詢,以便查看數(shù)據(jù)在某一時刻的狀態(tài);
· 與 Apache Spark、Hive 等大數(shù)據(jù)分析工具兼容。
Hudi 架構(gòu)
Apache Hudi 的架構(gòu)包括以下幾個主要組件:
· Hudi 數(shù)據(jù)存儲:Hudi 數(shù)據(jù)存儲是 Hudi 的核心組件,負責(zé)存儲數(shù)據(jù),數(shù)據(jù)存儲有兩種類型:Copy-On-Write(COW)和 Merge-On-Read(MOR);
· Copy-On-Write:COW 存儲類型會在對數(shù)據(jù)進行更新時,創(chuàng)建一個新的數(shù)據(jù)文件副本,將更新的數(shù)據(jù)寫入副本中,之后,新的數(shù)據(jù)文件副本會替換原始數(shù)據(jù)文件;
· Merge-On-Read:MOR 存儲類型會在查詢時,將更新的數(shù)據(jù)與原始數(shù)據(jù)進行合并,這種方式可以減少數(shù)據(jù)存儲的寫入延遲,但會增加查詢的計算量;
· Hudi 索引:Hudi 索引用于維護數(shù)據(jù)記錄的位置信息,索引有兩種類型:內(nèi)置索引(如 Bloom 過濾器)和外部索引(如 HBase 索引);
· Hudi 查詢引擎:Hudi 查詢引擎負責(zé)處理查詢請求,Hudi 支持多種查詢引擎,如 Spark SQL、Hive、Presto 等。

Hudi 的使用場景
Apache Hudi 可以幫助企業(yè)和組織實現(xiàn)實時數(shù)據(jù)處理和分析。實時數(shù)據(jù)處理需要快速地處理和查詢數(shù)據(jù),同時還需要保證數(shù)據(jù)的一致性和可靠性。
Apache Hudi 的增量數(shù)據(jù)處理、ACID 事務(wù)性保證、寫時合并等技術(shù)特性可以幫助企業(yè)更好地實現(xiàn)實時數(shù)據(jù)處理和分析,基于 Hudi 的特性可以在一定程度上在實時數(shù)倉的構(gòu)建過程中承擔(dān)上下游數(shù)據(jù)鏈路的對接(類似 Kafka 的角色)。既能實現(xiàn)增量的數(shù)據(jù)處理,也能為批流一體的處理提供存儲基礎(chǔ)。
Hudi 的優(yōu)勢和劣勢
● 優(yōu)勢
· 高效處理大規(guī)模數(shù)據(jù)集;
· 支持實時數(shù)據(jù)更新和查詢;
· 實現(xiàn)了增量寫入機制,提高了數(shù)據(jù)訪問效率;
· Hudi 可以與流處理管道集成;
· Hudi 提供了時間旅行功能,允許回溯數(shù)據(jù)的歷史版本。
● 劣勢
· 在讀寫數(shù)據(jù)時需要付出額外的代價;
· 操作比較復(fù)雜,需要使用專業(yè)的編程語言和工具。
Hudi 在袋鼠云數(shù)據(jù)湖平臺上的實踐
Hudi 在袋鼠云數(shù)據(jù)湖的技術(shù)架構(gòu)
Hudi 在袋鼠云的數(shù)據(jù)湖平臺上主要對數(shù)據(jù)湖管理提供助力:
· 元數(shù)據(jù)的接入,讓用戶可以快速的對表進行管理;
· 數(shù)據(jù)快速接入,包括對符合條件的原有表數(shù)據(jù)進行轉(zhuǎn)換,快速搭建數(shù)據(jù)湖能力;
· 湖表的管理,監(jiān)控小文件定期進行合并,提升表的查詢性能,內(nèi)在豐富的表操作功能,包括 time travel ,孤兒文件清理,過期快照清理等;
· 索引構(gòu)建,提供多種索引包括 bloom filter,zorder 等,提升計算引擎的查詢性能。

Hudi 使用示例
在介紹了 Hudi 的基本信息和袋鼠云數(shù)據(jù)湖平臺的結(jié)構(gòu)之后,我們來看一個使用示例,替換 Flink 在內(nèi)存中的 join 過程。
在 Flink 中對多流 join 往往是比較頭疼的場景,需要考慮 state ttl 時間設(shè)置,設(shè)置太小數(shù)據(jù)經(jīng)常關(guān)聯(lián)不上,設(shè)置太大內(nèi)存又需要很高才能保留,我們通過 Hudi 的方式來換個思路實現(xiàn)。
● 構(gòu)建 catalog
● 創(chuàng)建 hudi 表
● 更新 hudi 表的 flink_db.test_hudi_flink_join_2 的 id, name, age, dt 列
01 從 kafka 中讀取 topic1
02 從 kafka 中讀取 topic2
● 執(zhí)行插入邏輯1
● 通過 spark 查詢數(shù)據(jù)
20230323090605515 20230323090605515_1_186 45 1 c990a618-896c-4627-8243-baace65c7ad6-0_0-21-26_20230331101342388.parquet 45 xc 45 NULL 1
20230323090605515 20230323090605515_1_179 30 1 c990a618-896c-4627-8243-baace65c7ad6-0_0-21-26_20230331101342388.parquet 30 xc 30 NULL 1
● 執(zhí)行插入邏輯2
● 運行成功
運行成功后在 spark 中查詢對應(yīng)的表數(shù)據(jù):
20230323090605515 20230323090605515_1_186 45 1 c990a618-896c-4627-8243-baace65c7ad6-0_0-21-26_20230331101342388.parquet 45 xc 45 xc:address45 1
20230323090605515 20230323090605515_1_179 30 1 c990a618-896c-4627-8243-baace65c7ad6-0_0-21-26_20230331101342388.parquet 30 xc 30 xc:address30 1
可以發(fā)現(xiàn)在第二次數(shù)據(jù)運行之后,表數(shù)據(jù)的對應(yīng)字段 address 已經(jīng)更新,達到了類似在 Flink 中直接執(zhí)行 join 的效果。
《數(shù)據(jù)治理行業(yè)實踐白皮書》下載地址:https://fs80.cn/l134d5?
《數(shù)棧V6.0產(chǎn)品白皮書》下載地址:https://fs80.cn/cw0iw1
想了解或咨詢更多有關(guān)袋鼠云大數(shù)據(jù)產(chǎn)品、行業(yè)解決方案、客戶案例的朋友,瀏覽袋鼠云官網(wǎng):https://www.dtstack.com/?src=szbzhan
同時,歡迎對大數(shù)據(jù)開源項目有興趣的同學(xué)加入「袋鼠云開源框架釘釘技術(shù) qun」,交流最新開源技術(shù)信息,qun 號碼:30537511,項目地址:https://github.com/DTStack