Apache Hudi 是一款開(kāi)源的數(shù)據(jù)湖解決方案,它能夠幫助企業(yè)更好地管理和分析海量數(shù)據(jù),支持高效的數(shù)據(jù)更新和查詢(xún)。并提供多種數(shù)據(jù)壓縮和存儲(chǔ)格式以及索引功能,從而為企業(yè)數(shù)據(jù)倉(cāng)庫(kù)實(shí)踐提供更加靈活和高效的數(shù)據(jù)處理方式。
在金融領(lǐng)域,企業(yè)可以使用 Hudi 來(lái)處理大量需要實(shí)時(shí)查詢(xún)和更新的金融交易數(shù)據(jù)。在電商業(yè)務(wù)中,企業(yè)可以使用 Hudi 來(lái)跟蹤訂單數(shù)據(jù),以及對(duì)訂單進(jìn)行實(shí)時(shí)更新和查詢(xún)。在物流和供應(yīng)鏈管理中,Hudi 可以幫助企業(yè)實(shí)時(shí)處理和更新大量的物流數(shù)據(jù),保證數(shù)據(jù)的一致性和可靠性。
作為一站式大數(shù)據(jù)基礎(chǔ)軟件的袋鼠云數(shù)棧,基于 Apache Hudi 為客戶(hù)提供了存量數(shù)據(jù)遷移、數(shù)據(jù)入湖、文件治理等完整支持能力。在這個(gè)過(guò)程中,積累了一些 Hudi 性能優(yōu)化的經(jīng)驗(yàn),希望通過(guò)本文與大家分享交流。
Hudi 原理簡(jiǎn)析
Apache Hudi 是一個(gè)開(kāi)源的數(shù)據(jù)湖解決方案,它是基于 Hadoop 和 Spark 的技術(shù)棧構(gòu)建而成,并且拓展到了 Flink、 Trino 等多種計(jì)算引擎。Apache Hudi 的主要目的是提供一個(gè)高效、可擴(kuò)展且可靠的數(shù)據(jù)湖解決方案,用于管理和處理大規(guī)模的數(shù)據(jù)集。
Hudi 的核心實(shí)現(xiàn)是通過(guò)將數(shù)據(jù)集合劃分為多個(gè)數(shù)據(jù)文件,并為每個(gè)數(shù)據(jù)文件維護(hù)一個(gè)數(shù)據(jù)版本和索引信息,來(lái)支持增量數(shù)據(jù)更新和查詢(xún)操作。如下圖所示,當(dāng)用戶(hù)需要對(duì)數(shù)據(jù)進(jìn)行更新時(shí),Hudi 會(huì)將更新的數(shù)據(jù)寫(xiě)入一個(gè)新的數(shù)據(jù)文件中,并通過(guò)寫(xiě)時(shí)復(fù)制(copy-on-write)操作,將原始數(shù)據(jù)文件中的數(shù)據(jù)記錄復(fù)制到新的數(shù)據(jù)文件中,并在新的數(shù)據(jù)文件中更新對(duì)應(yīng)的數(shù)據(jù)記錄。
同時(shí),Hudi 會(huì)更新數(shù)據(jù)版本和索引信息,以便用戶(hù)可以根據(jù)數(shù)據(jù)版本和唯一標(biāo)識(shí)符來(lái)訪(fǎng)問(wèn)最新的數(shù)據(jù)記錄。當(dāng)用戶(hù)需要查詢(xún)數(shù)據(jù)時(shí),Hudi 會(huì)使用索引信息來(lái)定位數(shù)據(jù)記錄,并返回最新的數(shù)據(jù)記錄。
在 Hudi 的 merge on read 模式中,更新操作是通過(guò)在查詢(xún)時(shí)將原始數(shù)據(jù)和更新數(shù)據(jù)進(jìn)行合并來(lái)實(shí)現(xiàn)的。具體來(lái)說(shuō),當(dāng)有新的數(shù)據(jù)要被寫(xiě)入時(shí),Hudi 會(huì)將新數(shù)據(jù)追加寫(xiě)入到一個(gè)新的日志文件中,并在元數(shù)據(jù)文件中記錄新文件的信息。當(dāng)查詢(xún)數(shù)據(jù)時(shí),Hudi 會(huì)將所有數(shù)據(jù)文件進(jìn)行合并,生成一個(gè)視圖,然后對(duì)視圖進(jìn)行查詢(xún)。
由于 Hudi 只需要在查詢(xún)時(shí)將需要更新的數(shù)據(jù)進(jìn)行合并,而不需要在寫(xiě)入時(shí)進(jìn)行合并,因此可以避免寫(xiě)入時(shí)的性能開(kāi)銷(xiāo),從而實(shí)現(xiàn)快速的更新操作。
Apache Hudi 在寫(xiě)入數(shù)據(jù)時(shí)創(chuàng)建一個(gè)新版本,而讀取數(shù)據(jù)時(shí)通過(guò)將所有版本的數(shù)據(jù)進(jìn)行合并來(lái)生成一個(gè)視圖。在視圖中,每個(gè)數(shù)據(jù)記錄只出現(xiàn)一次,并且是最新的版本,這樣可以保證讀操作只會(huì)涉及到視圖中的數(shù)據(jù),而不會(huì)對(duì)原始數(shù)據(jù)進(jìn)行修改,從而實(shí)現(xiàn)了讀寫(xiě)分離。
通過(guò)多版本實(shí)現(xiàn)并發(fā)控制,Hudi 可以在保證數(shù)據(jù)一致性的前提下,提高讀操作的性能,同時(shí)也保證了數(shù)據(jù)的可靠性和可擴(kuò)展性。
Hudi 優(yōu)化實(shí)踐
下面介紹基于袋鼠云數(shù)棧的實(shí)踐經(jīng)驗(yàn),所做的 Hudi 性能優(yōu)化。
支持多索引
Hudi 將數(shù)據(jù)集合劃分為多個(gè)數(shù)據(jù)文件,并為每個(gè)數(shù)據(jù)文件維護(hù)一個(gè)數(shù)據(jù)版本和索引信息,來(lái)支持增量數(shù)據(jù)更新和查詢(xún)操作。通過(guò)構(gòu)建索引就可以利用生成的元數(shù)據(jù)快速定位查詢(xún)所需數(shù)據(jù)的位置,如下圖所示。這樣可以減少甚至避免從文件系統(tǒng)中掃描或者讀取不必要的數(shù)據(jù),減少 IO 的開(kāi)銷(xiāo),大大提升查詢(xún)效率。Hudi 已經(jīng)支持幾種不同的索引技術(shù),并且還在不斷地改進(jìn)和添加更多的索引實(shí)現(xiàn)。
袋鼠云數(shù)棧支持用戶(hù)在創(chuàng)建 Hudi 表時(shí)就設(shè)置想要使用的索引類(lèi)型,包括 SIMPLE、BLOOM FILTER、BUCKET 等類(lèi)型。在寫(xiě)入過(guò)程中,Hudi 會(huì)將索引信息寫(xiě)入到 parquet 文件或者外部存儲(chǔ)中,在讀取時(shí)應(yīng)用程序根據(jù)這些信息進(jìn)行比較判斷,跳過(guò)不必要的數(shù)據(jù)文件。
Hudi 在0.11.0版本引入了 MetadataTable 這種多模式索引,利用 MetadataTable 匯總元數(shù)據(jù)信息,應(yīng)用程序可以避免文件系統(tǒng)調(diào)用文件 Listing 操作(這在對(duì)象存儲(chǔ)中是非常耗時(shí)的),還可以避免直接讀取 parquet 文件中的 footer 信息,能夠大幅提升查詢(xún)性能。
袋鼠云數(shù)棧支持用戶(hù)在建表時(shí)就開(kāi)啟多模式索引,在寫(xiě)入數(shù)據(jù)的同時(shí)將文件的索引信息也寫(xiě)入 MetadataTable。數(shù)棧還支持以異步的方式構(gòu)建 MetadataTable,保證寫(xiě)入仍然處于低延遲的狀態(tài),再由后臺(tái)的應(yīng)用程序離線(xiàn)生成 MetadataTable 以提升讀取性能。
由于 MetadataTable 依賴(lài) base 文件記錄的 column stats/bloomfilter 等信息,因此 merge on read 模式下沒(méi)有辦法將 log 文件的信息保存到 MetadataTable 中,開(kāi)源框架上沒(méi)有利用它實(shí)現(xiàn)進(jìn)行文件過(guò)濾。
但考慮到 base 文件和 log 文件共用相同的 fileId,袋鼠云技術(shù)團(tuán)隊(duì)在數(shù)棧內(nèi)部進(jìn)行了改造:通過(guò) MetadataTable 獲取到 base 文件之后,再根據(jù) fileId 進(jìn)行 log 文件過(guò)濾,避免不必要讀取。經(jīng)過(guò)驗(yàn)證,這種改動(dòng)能夠使得 merge on read 模式具備和 copy on write 模式相同的過(guò)濾效果。
優(yōu)化文件布局
在大數(shù)據(jù)存儲(chǔ)中,文件布局優(yōu)化是一種重要的性能優(yōu)化技術(shù)。其主要目的是在數(shù)據(jù)寫(xiě)入時(shí)將數(shù)據(jù)按照一定的規(guī)則布局到存儲(chǔ)介質(zhì)中,以提高數(shù)據(jù)讀取和處理的效率。文件布局優(yōu)化可以采用多種方式,如時(shí)間戳排序、分區(qū)排序和合并文件等方式。
Hudi 提供了一種名為 Clustering 的文件布局優(yōu)化方法,可以借此將小文件合并成較大的文件以減少查詢(xún)引擎需要掃描的文件總數(shù),或者利用空間填充曲線(xiàn)之類(lèi)的概念來(lái)適應(yīng)數(shù)據(jù)湖布局并減少查詢(xún)讀取的數(shù)據(jù)量。利用 Clustering,可以將具有相同查詢(xún)特征的數(shù)據(jù)放到相鄰的幾個(gè)文件內(nèi),在查詢(xún)時(shí)再根據(jù)索引信息進(jìn)行過(guò)濾,能夠有效減少需要讀取的文件數(shù)量,降低計(jì)算成本。
袋鼠云數(shù)棧提供了可視化頁(yè)面以方便用戶(hù)對(duì)文件布局進(jìn)行調(diào)整,用戶(hù)可以根據(jù)需要自由設(shè)置排序策略、排序字段、過(guò)濾條件等,如下圖所示,應(yīng)用程序會(huì)周期性地在后臺(tái)根據(jù)配置對(duì)文件進(jìn)行優(yōu)化。因?yàn)?Hudi 采用多版本組織文件,用戶(hù)不需要擔(dān)心優(yōu)化任務(wù)會(huì)影響正在運(yùn)行的讀取任務(wù),在優(yōu)化完成后新的讀取任務(wù)即可享受到新的布局帶來(lái)的效率提升。
探索新特性
在落地 Hudi 的過(guò)程中,袋鼠云數(shù)棧也在積極跟蹤實(shí)踐社區(qū)的新功能新特性。
在 Hudi 0.13.0 中,Hudi 實(shí)現(xiàn)了“優(yōu)化記錄負(fù)載處理”的特性。通過(guò)設(shè)置 hoodie.datasource.write.record.merger.impls=org.apache.hudi.HoodieSparkRecordMerger 和 hoodie.logfile.data.block.format=parquet 兩個(gè)參數(shù)避免了額外的復(fù)制和反序列化,在寫(xiě)入操作的整個(gè)生命周期內(nèi)以統(tǒng)一的方式處理記錄。
袋鼠云數(shù)棧測(cè)試和引入了這項(xiàng)特性,經(jīng)過(guò)驗(yàn)證,更新性能相比上一版本有了約20%的提升,符合社區(qū)的描述。另外,數(shù)棧還參考了 Hudi 0.13.0 引入的 disruptor 無(wú)鎖消息隊(duì)列寫(xiě)入數(shù)據(jù)的新特性,通過(guò)設(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ì)在于支持增量數(shù)據(jù)處理,具有良好的數(shù)據(jù)一致性和可靠性,同時(shí)提供多種性能優(yōu)化技術(shù),能夠提高數(shù)據(jù)處理和查詢(xún)的效率,具有良好的性能和可擴(kuò)展性。
袋鼠云數(shù)棧團(tuán)隊(duì)在落地 Hudi 的過(guò)程中,驗(yàn)證了 Hudi 的多種索引,應(yīng)用了文件組織優(yōu)化功能,總結(jié)了常用的調(diào)優(yōu)參數(shù),為推動(dòng)企業(yè)數(shù)據(jù)湖建設(shè),提供可靠、高效、可擴(kuò)展的數(shù)據(jù)湖解決方案積累了不少經(jīng)驗(yàn),能夠幫助企業(yè)更好地管理和分析數(shù)據(jù),提高業(yè)務(wù)決策的精度和效率。
《數(shù)棧產(chǎn)品白皮書(shū)》:https://www.dtstack.com/resources/1004?src=szsm
《數(shù)據(jù)治理行業(yè)實(shí)踐白皮書(shū)》下載地址:https://www.dtstack.com/resources/1001?src=szsm
想了解或咨詢(xún)更多有關(guān)袋鼠云大數(shù)據(jù)產(chǎn)品、行業(yè)解決方案、客戶(hù)案例的朋友,瀏覽袋鼠云官網(wǎng):https://www.dtstack.com/?src=szbky文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-493414.html
同時(shí),歡迎對(duì)大數(shù)據(jù)開(kāi)源項(xiàng)目有興趣的同學(xué)加入「袋鼠云開(kāi)源框架釘釘技術(shù)qun」,交流最新開(kāi)源技術(shù)信息,qun號(hào)碼:30537511,項(xiàng)目地址:https://github.com/DTStack文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-493414.html
到了這里,關(guān)于性能提升30%!袋鼠云數(shù)?;?Apache Hudi 的性能優(yōu)化實(shí)戰(zhàn)解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!