1. Hudi 原理 | Apache Hudi 如何處理小文件問題

        共 2301字,需瀏覽 5分鐘

         ·

        2021-04-01 01:15


        1. 引入

        Apache Hudi是一個(gè)流行的開源的數(shù)據(jù)湖框架,Hudi提供的一個(gè)非常重要的特性是自動管理文件大小,而不用用戶干預(yù)。大量的小文件將會導(dǎo)致很差的查詢分析性能,因?yàn)椴樵円鎴?zhí)行查詢時(shí)需要進(jìn)行太多次文件的打開/讀取/關(guān)閉。在流式場景中不斷攝取數(shù)據(jù),如果不進(jìn)行處理,會產(chǎn)生很多小文件。

        2. 寫入時(shí) vs 寫入后

        一種常見的處理方法先寫入很多小文件,然后再合并成大文件以解決由小文件引起的系統(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會自管理文件大小,避免向查詢引擎暴露小文件,其中自動處理文件大小起很大作用。

        在進(jìn)行insert/upsert操作時(shí),Hudi可以將文件大小維護(hù)在一個(gè)指定文件大?。ㄗ⒁猓篵ulk_insert操作暫無此特性,其主要用于替換spark.write.parquet方式將數(shù)據(jù)快速寫入Hudi)。

        3. 配置

        我們使用COPY_ON_WRITE表來演示Hudi如何自動處理文件大小特性。

        關(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。

        4. 示例

        假設(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è)更新會增加文件的大小,會導(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將會插入80MB大小的記錄數(shù),F(xiàn)ile_2將會插入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(或者由之前的寫入自動推算每條記錄大小,然后根據(jù)配置的最大文件大小計(jì)算出來可以插入的記錄數(shù))決定,假設(shè)最后得到的該值為120K(每條記錄大小1K),如果還剩余300K的記錄數(shù),將會創(chuàng)建3個(gè)新文件(File_6,F(xiàn)ile_7,F(xiàn)ile_8),F(xiàn)ile_6和File_7都會分配120K的記錄數(shù),F(xiàn)ile_8會分配60K的記錄數(shù),共計(jì)60MB,后面再寫入時(shí),F(xiàn)ile_8會被認(rèn)為小文件,可以插入更多數(shù)據(jù)。

        Hudi利用諸如自定義分區(qū)之類的機(jī)制來優(yōu)化記錄分配到不同文件的能力,從而執(zhí)行上述算法。在這輪寫入完成之后,除File_8以外的所有文件均已調(diào)整為最佳大小,每次寫入都會遵循此過程,以確保Hudi表中沒有小文件。

        5. 總結(jié)

        本文介紹了Apache Hudi如何智能地管理小文件問題,即在寫入時(shí)找出小文件并分配指定大小的記錄數(shù)來規(guī)避小文件問題,基于該設(shè)計(jì),用戶再也不用擔(dān)心Apache Hudi數(shù)據(jù)湖中的小文件問題了。

        引用鏈接

        [1] hoodie.parquet.max.file.size: http://hudi.apache.org/docs/configurations.html#limitFileSize
        [2] hoodie.parquet.small.file.limit: (http://hudi.apache.org/docs/configurations.html#compactionSmallFileSize)
        [3] hoodie.copyonwrite.insert.split.size: http://hudi.apache.org/docs/configurations.html#insertSplitSize


        瀏覽 129
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 国产一级a毛一级a毛视频在线网站) | 国产chinasex麻豆videos | 啊啊好爽好舒服 | 国产高潮视频 | 无码婷婷婷婷 |