783
技術社區[雲棲]
MaxCompute(原ODPS)性能優化之合並小文件
背景
相信每個人都做過電腦磁盤整理,為什麼要做?因為文件被分散保存到整個磁盤的不同地方,而不是連續地保存在磁盤連續的簇中形成的。硬盤在使用一段時間後,由於反複寫入和刪除文件,磁盤中的空閑扇區會分散到整個磁盤中不連續的物理位置上,從而使文件不能存在連續的扇區裏。這樣,再讀寫文件時就需要到不同的地方去讀取,增加了磁頭的來回移動,降低了磁盤的訪問速度。
對於我們的大數據分析人員來講,也同樣的麵臨此類問題,分布式文件係統按塊Block存放,文件大小比塊大小小的文件,稱之為小文件。小文件過多,將帶來以下問題:
MaxCompute滿足一定的條件
解決方案
通過元數據檢測,我們認為分區中含有1000個以上的文件且平均文件大小小於128M的都可以進行小文件合並。即時合並:
ALTER TABLE tablename [PARTITION] MERGE SMALLFILES;
其中,PARTITION僅支持一級分區,另外涉及的其他係統參數如下:
(1) set odps.merge.cross.paths=true|false
設置是否跨路徑合並,對於表下麵有多個分區的情況,合並過程會將多個分區生成獨立的MergeAction進行合並,所以對於odps.merge.cross.paths設置為true,並不會改變路徑個數,隻是分別去合並每個路徑下的小文件而已;
(2) set odps.merge.smallfile.filesize.threshold = 128
設置合並文件的小文件大小閥值,文件大小超過該閥值,則不進行合並,單位為M,可以不設,不設時,則使用全局變量odps_g_merge_filesize_threshold,該值默認為32M,設置時必須大於32M。
(3) set odps.merge.maxmerged.filesize.threshold = 256
設置合並輸出文件量的大小,輸出文件大於該閥值,則創建新的輸出文件,單位為M,可以不設,不設時,則使用全局變odps_g_max_merged_filesize_threshold,該值默認為256M,設置時必須大於256M。
(4) set odps.merge.max.filenumber.per.instance = 2000
設置合並Fuxi Job的單個Instance允許合並的小文件個數,控製合並並行的Fuxi_inst個數,可以不設,不設時,則使用全局變量odps_g_merge_files_per_instance,該值默認為100個;在一個Merge任務中,需要的Fuxi_inst個數至少為該目錄下麵的總文件個數除以該限製。
(5) set odps.merge.max.filenumber.per.job = 50000
設置合並最大的小文件個數,小文件數量超過該限製,則超過限製部分的文件忽略,不進行合並,可以不設,不設時,則使用全局變量odps_g_max_merge_files,該值默認為10000個;
相關參數的設置如下:
set odps.merge.cross.paths=true;
set odps.merge.smallfile.filesize.threshold=128;
set odps.merge.max.filenumber.per.instance = 2000;
set odps.merge.max.filenumber.per.job=50000;
阿裏巴巴大數據-玩家社區 https://yq.aliyun.com/teams/6/
---阿裏大數據博文,問答,社群,實踐,有朋自遠方來,不亦說乎……
最後更新:2017-08-24 21:02:16