干貨分享|袋鼠云數(shù)棧離線開發(fā)平臺(tái)在小文件治理上的探索實(shí)踐之路
日常生產(chǎn)中 HDFS 上小文件產(chǎn)生是一個(gè)很正常的事情,同時(shí)小文件也是 Hadoop 集群運(yùn)維中的常見挑戰(zhàn),尤其對(duì)于大規(guī)模運(yùn)行的集群來說可謂至關(guān)重要。

數(shù)據(jù)地圖是離線開發(fā)產(chǎn)品的基本使用單位,包含全部表和項(xiàng)目的相關(guān)信息,可以對(duì)表做相關(guān)的權(quán)限管理和脫敏管理操作,以及可以展示對(duì)應(yīng)項(xiàng)目占用情況和其表的占用情況。數(shù)據(jù)地圖可以幫助用戶更好地查找、理解和使用數(shù)據(jù)。
本文將結(jié)合兩者,和大家聊聊數(shù)據(jù)地圖中的小文件治理應(yīng)該怎么做。
小文件的危害
小文件通常指文件大小要比 HDFS 塊大小還要小很多的文件,大量的小文件會(huì)給 Hadoop 集群的擴(kuò)展性和性能帶來嚴(yán)重的影響。
NameNode 在內(nèi)存中維護(hù)整個(gè)文件系統(tǒng)的元數(shù)據(jù)鏡像、用戶 HDFS 的管理,其中每個(gè) HDFS 文件元信息(位置、大小、分塊等)對(duì)象約占150字節(jié),如果小文件過多,會(huì)占用大量?jī)?nèi)存,直接影響 NameNode 的性能。相對(duì)地,HDFS 讀寫小文件也會(huì)更加耗時(shí),因?yàn)槊看味夹枰獜?NameNode 獲取元信息,并與對(duì)應(yīng)的 DataNode 建立連接。如果 NameNode 在宕機(jī)中恢復(fù),也需要更多的時(shí)間從元數(shù)據(jù)文件中加載。
同時(shí),小文件會(huì)給 Spark SQL 等查詢引擎造成查詢性能的損耗,大量的數(shù)據(jù)分片信息以及對(duì)應(yīng)產(chǎn)生的 Task 元信息也會(huì)給?Spark Driver?的內(nèi)存造成壓力,帶來單點(diǎn)問題。此外,入庫操作最后的 commit job 操作,在 Spark Driver 端單點(diǎn)做,很容易出現(xiàn)單點(diǎn)的性能問題。
數(shù)據(jù)地圖中小文件治理的做法
存儲(chǔ)在 HDFS 中的文件被分成塊,然后將這些塊復(fù)制到多個(gè)計(jì)算機(jī)中(DataNode),塊的大小默認(rèn)為128MB,當(dāng)文件大小為128時(shí),Hadoop 集群的計(jì)算效率最高。因此對(duì)非分區(qū)表按表進(jìn)行數(shù)據(jù)文件合并,使表/分區(qū)數(shù)據(jù)文件的大小接近128M,以此進(jìn)行小文件的優(yōu)化。
具體到數(shù)據(jù)地圖中是怎么做的呢?
在離線開發(fā)平臺(tái)中創(chuàng)建出來的表或者底層表都可以通過數(shù)據(jù)地圖功能維護(hù),我們每天會(huì)定時(shí)更新這些表的基本信息進(jìn)行統(tǒng)一維護(hù)管理。
在數(shù)據(jù)地圖中可以根據(jù)文件數(shù)量和占用存儲(chǔ)創(chuàng)建相應(yīng)的治理規(guī)則,按照每天每周或每月治理。

參數(shù)說明?
· 規(guī)則名稱:新建規(guī)則的名稱
· 選擇項(xiàng)目:小文件合并規(guī)則生效的項(xiàng)目
· 選擇表:這里配置的是圈定需要合并的表范圍,判斷條件是 and,例如表的文件數(shù)量大于1000并且占用總存儲(chǔ)小于10M時(shí),才會(huì)對(duì)該表中的文件進(jìn)行合并操作
· 治理時(shí)間:該規(guī)則的調(diào)度周期,例如每天的凌晨00:00~01:00進(jìn)行小文件合并,注意如果小文件合并時(shí)間到了結(jié)束的時(shí)間,還沒有合并完成,則會(huì)結(jié)束當(dāng)前的合并,等待下次處理

根據(jù)治理規(guī)則查詢出所有符合信息的表,判斷該表是否為分區(qū)表。如果為非分區(qū)表則對(duì)該表進(jìn)行文件治理,如果為分區(qū)表則按照分區(qū)進(jìn)行治理,最后創(chuàng)建治理記錄。

每天定時(shí)任務(wù)觸發(fā),根據(jù)告警記錄查詢記錄中滿足條件的表的基本信息狀態(tài)。

● 小文件合并的具體步驟
1)備份文件
先創(chuàng)建臨時(shí)路徑,把文件復(fù)制到臨時(shí)路徑中去,再創(chuàng)建要合并的臨時(shí)文件

2)小文件合并
執(zhí)行 HDFS 的 fileMerge 請(qǐng)求合并文件

真正調(diào)用 hive-exec 方法處理,判斷是否達(dá)到閾值合并文件


3)將合并的文件覆蓋到原文件中去
判斷如果合并完成,刪除原路徑下的數(shù)據(jù),把臨時(shí)路徑修改為原來的真實(shí)路徑

全部處理完成后,查詢 rdos_file_merge_partition 表是否為異常信息打印,若不存在異常信息,更新治理記錄表完成治理,并更新數(shù)據(jù)地圖中的表信息
治理記錄表把握整體的治理成功失敗狀態(tài),分區(qū)信息治理信表維護(hù)了整個(gè)治理記錄哪些表治理失敗的記錄,最后全量返回對(duì)應(yīng)的是失敗或成功狀態(tài)。
· 分區(qū)信息治理信表:rdos_file_merge_partition
· 治理記錄表:rdos_file_merge_record
最后把表結(jié)構(gòu)放在下面,有興趣的小伙伴可以自行查看:
《數(shù)據(jù)治理行業(yè)實(shí)踐白皮書》下載地址:https://fs80.cn/l134d5?
想了解或咨詢更多有關(guān)袋鼠云大數(shù)據(jù)產(chǎn)品、行業(yè)解決方案、客戶案例的朋友,瀏覽袋鼠云官網(wǎng):https://www.dtstack.com/?src=szbzhan
同時(shí),歡迎對(duì)大數(shù)據(jù)開源項(xiàng)目有興趣的同學(xué)加入「袋鼠云開源框架釘釘技術(shù) qun」,交流最新開源技術(shù)信息,qun 號(hào)碼:30537511,項(xiàng)目地址:https://github.com/DTStack