閱讀783 返回首頁    go 技術社區[雲棲]


MaxCompute(原ODPS)性能優化之合並小文件

背景

相信每個人都做過電腦磁盤整理,為什麼要做?因為文件被分散保存到整個磁盤的不同地方,而不是連續地保存在磁盤連續的簇中形成的。硬盤在使用一段時間後,由於反複寫入和刪除文件,磁盤中的空閑扇區會分散到整個磁盤中不連續的物理位置上,從而使文件不能存在連續的扇區裏。這樣,再讀寫文件時就需要到不同的地方去讀取,增加了磁頭的來回移動,降低了磁盤的訪問速度。

對於我們的大數據分析人員來講,也同樣的麵臨此類問題,分布式文件係統按塊Block存放,文件大小比塊大小小的文件,稱之為小文件。小文件過多,將帶來以下問題:



MaxCompute滿足一定的條件

3c3a3e538a040a0b5adf0ee354ae022338a05436

解決方案

通過元數據檢測,我們認為分區中含有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/

---阿裏大數據博文,問答,社群,實踐,有朋自遠方來,不亦說乎……

bba01b493e1c5d904e882b1c380673c6ebe49a98

最後更新:2017-08-24 21:02:16

  上一篇:go  區塊鏈未來會發展成什麼模樣?
  下一篇:go  站點中如何應用OSS資源