您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何理解MaxCompute小文件問題的優化方案,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
分布式文件系統按塊Block存放,文件大小比塊大小小的文件(默認塊大小為64M),叫做小文件。
查看文件數量
desc extended + 表名
cdn.com/8195ee2319091002c1cfa397341611b3c77b15c1.png">
1、非分區表,表文件數達到1000個,文件平均大小小于64M
2、分區表: a) 單個分區文件數達到1000個,文件平均大小小于64M,
b) 整個非分區表分區數達到五萬 (系統限制為6萬)
1、表設計不合理導致:分區多導致文件多,比如按天按小時按業務單元(假如有6個業務單元BU)分區,那么一年下來,分區數將會達到365246=52560。
2、在使用Tunnel、Datahub、Console等數據集成工具上傳上傳數據時,頻繁Commit,寫入表(表分區)使用不合理導致:每個分區存在多個文件,文件數達到幾百上千,其中大多數是大小只有幾 k 的小文件。
3、在使用insert into寫入數據時過,幾條數據就寫入一次,并且頻繁的寫入。
4、Reduce過程中產生小文件過多。
5、Job執行過程中生成的各種臨時文件、回收站保留的過期的文件過多。
注意:雖然在MaxCompute系統側會自動做小文件合并的優化,但對于原因1、2、3需要客戶采用合理的表分區設計和上傳數據的方法才可以避免。
MaxCompute處理單個大文件比處理多個小文件更有效率,小文件過多會影響整體的執行性能;小文件過多會給文件系統帶來一定的壓力,且影響空間的有效利用。MaxCompute對單個fuxi Instance可以處理的小文件數限制為120個,文件數過多影響fuxi instance數目,影響整體性能。
set odps.merge.max.filenumber.per.job=50000; --值默認為50000個;當分區數大于50000時需要調整,最大可到1000000萬,大于1000000的提交多次merge ALTER TABLE 表名[partition] MERGE SMALLFILES;
如果您的表已經是分區表,請檢查您的分區字段是否是可收斂的,如果分區數過多同樣會影響計算性能,建議用日期做分區。
1、定期執行合并小文件命令;
2、如果是按日期建的分區,可以每天對前一天的分區數據用insert overwrite重新覆蓋寫入。
例如:
insert overwrite table tableA partition (ds='20181220') select * from tableA where ds='20181220';
如果您的表是非分區表,您可以定期執行合并小文件命令來優化小文件問題,但強烈建議您設計成分區表:
1、先創建一個新的分區表,建議按日期做分區,合理設置生命周期,以方便進行歷史數據回收;
2、把原非分區表的數據導入新的分區表;(建議先暫停原非分區表的實時寫入業務)
例如:
create table sale_detail_patition like sale_detail; alter table sale_detail_insert add partition(sale_date='201812120', region='china'); insert overwrite table sale_detail_patition partition (sale_date='20181220', region='china') select * from sale_detail;
3、修改上下游業務:入庫程序改成寫入新分區表,查詢作業改成從新分區表中查詢;
4、新分區表完成數據遷移和驗證后,刪除原分區表。
注意:如果您使用insert overwrite重新寫入全量數據合并小文件時,請注意一定不要同時存在insert overwrite和insert into同時存在的情況,否則有丟失數據的風險。
合理設計表分區,分區字段是盡量是可收斂或可管理的,如果分區數過多同樣會影響計算性能,建議用日期做分區,并合理設置表的生命周期,以方便對歷史數據回收,也可控制您的存儲成本。
1、Tunnel->MaxCompute
使用Tunnel上傳數據時避免頻繁commit,盡量保證每次提交的DataSize大于64M,請參考
《離線批量數據通道Tunnel的最佳實踐及常見問題》
2、Datahub->MaxCompute
如果用Datahub產生小文件,建議合理申請shard,可以根據topic的Throughput合理做shard合并,減少shard數量。可以根據topic的Throughput觀察數據流量變化,適當調大數據寫入的間隔時間。
申請Datahub shard數目的策略(申請過多的datahub shard將會產生小文件問題)
1)默認吞吐量單個shard是1MB/s,可以按照這個分配實際的shard數目(可以在此基礎上多加幾個);
2)同步MaxCompute的邏輯是每個shard有一個單獨的task(滿足5分鐘或者64MB會commit一次),默認設置5分鐘是為了盡快能在MaxCompute查到數據。如果是按照小時建partition,那個一個shard每個小時有12個文件。如果這個時候數據量很少,但是shard很多,在MaxCompute里面就會很多小文件(shard*12/hour)。所以不要過多的分配shard,按需分配。
參考建議:如果流量是5M/s,那么就申請5個shard,為預防流量峰值預留20%的Buffer,可以申請6個shard。
3、DataX->MaxCompute
因為datax也是封裝了tunnel的SDK來寫入MaxCompute的,因此,建議您在配置ODPSWriter的時候,把blockSizeInMB這個參數不要設置太小,最好是64M以上。
關于如何理解MaxCompute小文件問題的優化方案就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。