Apache Hudi如何智能處理小文件問題,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)建站憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗(yàn),為客戶提供超值的營銷型網(wǎng)站建設(shè)服務(wù),我們始終認(rèn)為:好的營銷型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個(gè)人等客戶提供了成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)服務(wù),以良好的商業(yè)信譽(yù),完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。
Apache Hudi是一個(gè)流行的開源的數(shù)據(jù)湖框架,Hudi提供的一個(gè)非常重要的特性是自動(dòng)管理文件大小,而不用用戶干預(yù)。大量的小文件將會(huì)導(dǎo)致很差的查詢分析性能,因?yàn)椴樵円鎴?zhí)行查詢時(shí)需要進(jìn)行太多次文件的打開/讀取/關(guān)閉。在流式場景中不斷攝取數(shù)據(jù),如果不進(jìn)行處理,會(huì)產(chǎn)生很多小文件。
一種常見的處理方法先寫入很多小文件,然后再合并成大文件以解決由小文件引起的系統(tǒng)擴(kuò)展性問題,但由于暴露太多小文件可能導(dǎo)致不能保證查詢的SLA。實(shí)際上對于Hudi表,通過Hudi提供的Clustering功能可以非常輕松的做到這一點(diǎn),更多細(xì)節(jié)可參考之前一篇文章查詢時(shí)間降低60%!Apache Hudi數(shù)據(jù)布局黑科技了解下。
本篇文章將介紹Hudi的文件大小優(yōu)化策略,即在寫入時(shí)處理。Hudi會(huì)自管理文件大小,避免向查詢引擎暴露小文件,其中自動(dòng)處理文件大小起很大作用。
在進(jìn)行insert/upsert
操作時(shí),Hudi可以將文件大小維護(hù)在一個(gè)指定文件大?。ㄗ⒁猓篵ulk_insert操作暫無此特性,其主要用于替換spark.write.parquet
方式將數(shù)據(jù)快速寫入Hudi)。
我們使用COPY_ON_WRITE表來演示Hudi如何自動(dòng)處理文件大小特性。
關(guān)鍵配置項(xiàng)如下:
?hoodie.parquet.max.file.size[1]:數(shù)據(jù)文件最大大小,Hudi將試著維護(hù)文件大小到該指定值;?hoodie.parquet.small.file.limit[2]:小于該大小的文件均被視為小文件;?hoodie.copyonwrite.insert.split.size[3]:單文件中插入記錄條數(shù),此值應(yīng)與單個(gè)文件中的記錄數(shù)匹配(可以根據(jù)最大文件大小和每個(gè)記錄大小來確定)
例如如果你第一個(gè)配置值設(shè)置為120MB,第二個(gè)配置值設(shè)置為100MB,則任何大小小于100MB的文件都將被視為一個(gè)小文件,如果要關(guān)閉此功能,可將hoodie.parquet.small.file.limit
配置值設(shè)置為0。
假設(shè)一個(gè)指定分區(qū)下數(shù)據(jù)文件布局如下
假設(shè)配置的hoodie.parquet.max.file.size
為120MB,hoodie.parquet.small.file.limit
為100MB。File_1大小為40MB,F(xiàn)ile_2大小為80MB,F(xiàn)ile_3是90MB,F(xiàn)ile_4是130MB,F(xiàn)ile_5是105MB,當(dāng)有新寫入時(shí)其流程如下:
步驟一:將更新分配到指定文件,這一步將查找索引來找到相應(yīng)的文件,假設(shè)更新會(huì)增加文件的大小,會(huì)導(dǎo)致文件變大。當(dāng)更新減小文件大小時(shí)(例如使許多字段無效),則隨后的寫入將文件將越來越小。
步驟二:根據(jù)hoodie.parquet.small.file.limit
決定每個(gè)分區(qū)下的小文件,我們的示例中該配置為100MB,所以小文件為File_1、File_2和File_3;
步驟三:確定小文件后,新插入的記錄將分配給小文件以便使其達(dá)到120MB,F(xiàn)ile_1將會(huì)插入80MB大小的記錄數(shù),F(xiàn)ile_2將會(huì)插入40MB大小的記錄數(shù),F(xiàn)ile_3將插入30MB大小的記錄數(shù)。
步驟四:當(dāng)所有小文件都分配完了對應(yīng)插入記錄數(shù)后,如果還有剩余未分配的插入記錄,這些記錄將分配給新創(chuàng)建的FileGroup/數(shù)據(jù)文件。數(shù)據(jù)文件中的記錄數(shù)由hoodie.copyonwrite.insert.split.size
(或者由之前的寫入自動(dòng)推算每條記錄大小,然后根據(jù)配置的最大文件大小計(jì)算出來可以插入的記錄數(shù))決定,假設(shè)最后得到的該值為120K(每條記錄大小1K),如果還剩余300K的記錄數(shù),將會(huì)創(chuàng)建3個(gè)新文件(File_6,F(xiàn)ile_7,F(xiàn)ile_8),F(xiàn)ile_6和File_7都會(huì)分配120K的記錄數(shù),F(xiàn)ile_8會(huì)分配60K的記錄數(shù),共計(jì)60MB,后面再寫入時(shí),F(xiàn)ile_8會(huì)被認(rèn)為小文件,可以插入更多數(shù)據(jù)。
Hudi利用諸如自定義分區(qū)之類的機(jī)制來優(yōu)化記錄分配到不同文件的能力,從而執(zhí)行上述算法。在這輪寫入完成之后,除File_8以外的所有文件均已調(diào)整為最佳大小,每次寫入都會(huì)遵循此過程,以確保Hudi表中沒有小文件。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。