性能提升30%!袋鼠云數(shù)?;?Apache Hudi 的性能優(yōu)化實戰(zhàn)解析
Apache Hudi 是一款開源的數(shù)據(jù)湖解決方案,它能夠幫助企業(yè)更好地管理和分析海量數(shù)據(jù),支持高效的數(shù)據(jù)更新和查詢。并提供多種數(shù)據(jù)壓縮和存儲格式以及索引功能,從而為企業(yè)數(shù)據(jù)倉庫實踐提供更加靈活和高效的數(shù)據(jù)處理方式。
在金融領(lǐng)域,企業(yè)可以使用 Hudi 來處理大量需要實時查詢和更新的金融交易數(shù)據(jù)。在電商業(yè)務(wù)中,企業(yè)可以使用 Hudi 來跟蹤訂單數(shù)據(jù),以及對訂單進行實時更新和查詢。在物流和供應(yīng)鏈管理中,Hudi 可以幫助企業(yè)實時處理和更新大量的物流數(shù)據(jù),保證數(shù)據(jù)的一致性和可靠性。
作為一站式大數(shù)據(jù)基礎(chǔ)軟件的袋鼠云數(shù)棧,基于 Apache Hudi 為客戶提供了存量數(shù)據(jù)遷移、數(shù)據(jù)入湖、文件治理等完整支持能力。在這個過程中,積累了一些 Hudi 性能優(yōu)化的經(jīng)驗,希望通過本文與大家分享交流。
Hudi 原理簡析
Apache Hudi 是一個開源的數(shù)據(jù)湖解決方案,它是基于 Hadoop 和 Spark 的技術(shù)棧構(gòu)建而成,并且拓展到了 Flink、 Trino 等多種計算引擎。Apache Hudi 的主要目的是提供一個高效、可擴展且可靠的數(shù)據(jù)湖解決方案,用于管理和處理大規(guī)模的數(shù)據(jù)集。
Hudi 的核心實現(xiàn)是通過將數(shù)據(jù)集合劃分為多個數(shù)據(jù)文件,并為每個數(shù)據(jù)文件維護一個數(shù)據(jù)版本和索引信息,來支持增量數(shù)據(jù)更新和查詢操作。如下圖所示,當(dāng)用戶需要對數(shù)據(jù)進行更新時,Hudi 會將更新的數(shù)據(jù)寫入一個新的數(shù)據(jù)文件中,并通過寫時復(fù)制(copy-on-write)操作,將原始數(shù)據(jù)文件中的數(shù)據(jù)記錄復(fù)制到新的數(shù)據(jù)文件中,并在新的數(shù)據(jù)文件中更新對應(yīng)的數(shù)據(jù)記錄。
同時,Hudi 會更新數(shù)據(jù)版本和索引信息,以便用戶可以根據(jù)數(shù)據(jù)版本和唯一標識符來訪問最新的數(shù)據(jù)記錄。當(dāng)用戶需要查詢數(shù)據(jù)時,Hudi 會使用索引信息來定位數(shù)據(jù)記錄,并返回最新的數(shù)據(jù)記錄。

在 Hudi 的 merge on read 模式中,更新操作是通過在查詢時將原始數(shù)據(jù)和更新數(shù)據(jù)進行合并來實現(xiàn)的。具體來說,當(dāng)有新的數(shù)據(jù)要被寫入時,Hudi 會將新數(shù)據(jù)追加寫入到一個新的日志文件中,并在元數(shù)據(jù)文件中記錄新文件的信息。當(dāng)查詢數(shù)據(jù)時,Hudi 會將所有數(shù)據(jù)文件進行合并,生成一個視圖,然后對視圖進行查詢。
由于 Hudi 只需要在查詢時將需要更新的數(shù)據(jù)進行合并,而不需要在寫入時進行合并,因此可以避免寫入時的性能開銷,從而實現(xiàn)快速的更新操作。
Apache Hudi 在寫入數(shù)據(jù)時創(chuàng)建一個新版本,而讀取數(shù)據(jù)時通過將所有版本的數(shù)據(jù)進行合并來生成一個視圖。在視圖中,每個數(shù)據(jù)記錄只出現(xiàn)一次,并且是最新的版本,這樣可以保證讀操作只會涉及到視圖中的數(shù)據(jù),而不會對原始數(shù)據(jù)進行修改,從而實現(xiàn)了讀寫分離。
通過多版本實現(xiàn)并發(fā)控制,Hudi 可以在保證數(shù)據(jù)一致性的前提下,提高讀操作的性能,同時也保證了數(shù)據(jù)的可靠性和可擴展性。
Hudi 優(yōu)化實踐
下面介紹基于袋鼠云數(shù)棧的實踐經(jīng)驗,所做的 Hudi 性能優(yōu)化。
支持多索引
Hudi 將數(shù)據(jù)集合劃分為多個數(shù)據(jù)文件,并為每個數(shù)據(jù)文件維護一個數(shù)據(jù)版本和索引信息,來支持增量數(shù)據(jù)更新和查詢操作。通過構(gòu)建索引就可以利用生成的元數(shù)據(jù)快速定位查詢所需數(shù)據(jù)的位置,如下圖所示。這樣可以減少甚至避免從文件系統(tǒng)中掃描或者讀取不必要的數(shù)據(jù),減少 IO 的開銷,大大提升查詢效率。Hudi 已經(jīng)支持幾種不同的索引技術(shù),并且還在不斷地改進和添加更多的索引實現(xiàn)。
袋鼠云數(shù)棧支持用戶在創(chuàng)建 Hudi 表時就設(shè)置想要使用的索引類型,包括 SIMPLE、BLOOM FILTER、BUCKET 等類型。在寫入過程中,Hudi 會將索引信息寫入到 parquet 文件或者外部存儲中,在讀取時應(yīng)用程序根據(jù)這些信息進行比較判斷,跳過不必要的數(shù)據(jù)文件。

Hudi 在0.11.0版本引入了 MetadataTable 這種多模式索引,利用 MetadataTable 匯總元數(shù)據(jù)信息,應(yīng)用程序可以避免文件系統(tǒng)調(diào)用文件 Listing 操作(這在對象存儲中是非常耗時的),還可以避免直接讀取 parquet 文件中的 footer 信息,能夠大幅提升查詢性能。
袋鼠云數(shù)棧支持用戶在建表時就開啟多模式索引,在寫入數(shù)據(jù)的同時將文件的索引信息也寫入 MetadataTable。數(shù)棧還支持以異步的方式構(gòu)建 MetadataTable,保證寫入仍然處于低延遲的狀態(tài),再由后臺的應(yīng)用程序離線生成 MetadataTable 以提升讀取性能。
由于 MetadataTable 依賴 base 文件記錄的 column stats/bloomfilter 等信息,因此 merge on read 模式下沒有辦法將 log 文件的信息保存到 MetadataTable 中,開源框架上沒有利用它實現(xiàn)進行文件過濾。
但考慮到 base 文件和 log 文件共用相同的 fileId,袋鼠云技術(shù)團隊在數(shù)棧內(nèi)部進行了改造:通過 MetadataTable 獲取到 base 文件之后,再根據(jù) fileId 進行 log 文件過濾,避免不必要讀取。經(jīng)過驗證,這種改動能夠使得 merge on read 模式具備和 copy on write 模式相同的過濾效果。
優(yōu)化文件布局
在大數(shù)據(jù)存儲中,文件布局優(yōu)化是一種重要的性能優(yōu)化技術(shù)。其主要目的是在數(shù)據(jù)寫入時將數(shù)據(jù)按照一定的規(guī)則布局到存儲介質(zhì)中,以提高數(shù)據(jù)讀取和處理的效率。文件布局優(yōu)化可以采用多種方式,如時間戳排序、分區(qū)排序和合并文件等方式。
Hudi 提供了一種名為 Clustering 的文件布局優(yōu)化方法,可以借此將小文件合并成較大的文件以減少查詢引擎需要掃描的文件總數(shù),或者利用空間填充曲線之類的概念來適應(yīng)數(shù)據(jù)湖布局并減少查詢讀取的數(shù)據(jù)量。利用 Clustering,可以將具有相同查詢特征的數(shù)據(jù)放到相鄰的幾個文件內(nèi),在查詢時再根據(jù)索引信息進行過濾,能夠有效減少需要讀取的文件數(shù)量,降低計算成本。
袋鼠云數(shù)棧提供了可視化頁面以方便用戶對文件布局進行調(diào)整,用戶可以根據(jù)需要自由設(shè)置排序策略、排序字段、過濾條件等,如下圖所示,應(yīng)用程序會周期性地在后臺根據(jù)配置對文件進行優(yōu)化。因為 Hudi 采用多版本組織文件,用戶不需要擔(dān)心優(yōu)化任務(wù)會影響正在運行的讀取任務(wù),在優(yōu)化完成后新的讀取任務(wù)即可享受到新的布局帶來的效率提升。

探索新特性
在落地 Hudi 的過程中,袋鼠云數(shù)棧也在積極跟蹤實踐社區(qū)的新功能新特性。
在 Hudi 0.13.0 中,Hudi 實現(xiàn)了“優(yōu)化記錄負載處理”的特性。通過設(shè)置 hoodie.datasource.write.record.merger.impls=org.apache.hudi.HoodieSparkRecordMerger 和 hoodie.logfile.data.block.format=parquet 兩個參數(shù)避免了額外的復(fù)制和反序列化,在寫入操作的整個生命周期內(nèi)以統(tǒng)一的方式處理記錄。
袋鼠云數(shù)棧測試和引入了這項特性,經(jīng)過驗證,更新性能相比上一版本有了約20%的提升,符合社區(qū)的描述。另外,數(shù)棧還參考了 Hudi 0.13.0 引入的 disruptor 無鎖消息隊列寫入數(shù)據(jù)的新特性,通過設(shè)置 hoodie.write.executor.type = DISRUPTOR 和 hoodie.write.executor.disruptor.wait.strategy = BUSY_SPIN_WAIT 參數(shù),結(jié)合前述的優(yōu)化配置,更新性能整體提升了30%以上。
總結(jié)
Apache Hudi 的優(yōu)勢在于支持增量數(shù)據(jù)處理,具有良好的數(shù)據(jù)一致性和可靠性,同時提供多種性能優(yōu)化技術(shù),能夠提高數(shù)據(jù)處理和查詢的效率,具有良好的性能和可擴展性。
袋鼠云數(shù)棧團隊在落地 Hudi 的過程中,驗證了 Hudi 的多種索引,應(yīng)用了文件組織優(yōu)化功能,總結(jié)了常用的調(diào)優(yōu)參數(shù),為推動企業(yè)數(shù)據(jù)湖建設(shè),提供可靠、高效、可擴展的數(shù)據(jù)湖解決方案積累了不少經(jīng)驗,能夠幫助企業(yè)更好地管理和分析數(shù)據(jù),提高業(yè)務(wù)決策的精度和效率。
《數(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