1)預設情況下
textinputformat對任務的切片機制是按檔案規劃切片,不管檔案多小,都會是乙個單獨的切片,都會交給乙個maptask,這樣如果有大量小檔案,就會產生大量的maptask,處理效率極其低下。
2)優化策略
(1)最好的辦法,在資料處理系統的最前端(預處理/採集),將小檔案先合併成大檔案,再上傳到hdfs做後續分析。
(2)補救措施:如果已經是大量小檔案在hdfs中了,可以使用另一種inputformat來做切片 (combinetextinputformat),它的切片邏輯跟textfileinputformat不同:它可以將多個小檔案從邏輯上規劃到乙個切片中,這樣,多個小檔案就可以交給乙個maptask。
下面的是fileinputformat的結構目錄: 結構樹:
(3)優先滿足最小切片大小,不超過最大切片大小
combinetextinputformat.setmaxinputsplitsize(job, 3*1024*1024);// 3m (初始單位是位元組)
combinetextinputformat.setmininputsplitsize(job, 2*1024*1024);// 2m(初始單位是位元組)
10=3+3+4(三片)
11=3+3+3+2(四片)(因為最後一片,滿足最小切片)
3)具體實現步驟
// 如果不設定inputformat,它預設用的是textinputformat.class
job.setinputformatclass(combinetextinputformat.class)
combinetextinputformat.setmaxinputsplitsize(job, 4194304);// 3m
combinetextinputformat.setmininputsplitsize(job, 2097152);// 2m
注:在看
number of splits
時,和最大值
(maxsplitsize)
有關、總體規律就是和低於最大值是一片、高於最大值
1.5倍
+,則為兩片;高於最大值
2倍以上則向下取整,比如檔案大小
65mb
,切片最大值為
4mb,
那麼切片為16個
.總體來說,切片差值不超過
1個,不影響整體效能 (會有誤差,不是精準型)
優化多個小檔案案例:
優化檔案**:
//將多個小檔案劃分為乙個maptask執行----一種優化
//檢視繼承樹快捷鍵 ctrl+h
job.setinputformatclass(combinetextinputformat.class);
combinetextinputformat.setmaxinputsplitsize(job,3*1024*1024);
combinetextinputformat.setmininputsplitsize(job,2*1024*1024);
輸出:
//配置輸入資料的路徑
fileinputformat.setinputpaths(job, new path("d:\\input\\test\\plus\\five"));
//配置輸出的路徑
fileoutputformat.setoutputpath(job, new path("d:\\input\\test\\plus\\11031"));
下面是檔案大小:六個檔案一共42.6m
結果:
mapreduce關於大量小檔案的優化策略
在分布式的架構中,分布式檔案系統hdfs,和分布式運算程式程式設計框架mapreduce。hdfs 不怕大檔案,怕很多小檔案 mapreduce 怕資料傾斜 那麼mapreduce是如果解決多個小檔案的問題呢?mapreduce關於大量小檔案的優化策略 1 預設情況下,textinputformat...
MapReduce大量小檔案問題
1.預設情況下,textinputformat對任務的切片機制是按檔案規劃切片,不管檔案多小,都會是乙個單獨的切片,都會交給maptaskz這樣,如果有大量小檔案,就會產生大量的maptask,處理效率及其低下 2.優化方法 最好的辦法 在資料處理系統的最前端 預處理 採集 就將小檔案合併成大檔案,...
快速刪除大量小檔案
由於bash會展開例如 rm aa 這樣的命令 如果後面的檔案太多就會報引數太長,所以有時候刪除大量小檔案就不適合用rm了 可以使用find先查詢在刪除 就不會出現上面那種報錯問題,可是還有乙個問題檔案太多的話 exec rm 完全沒有效率,一兩個小時估計也就只能刪除幾十萬的檔案 對於需要刪除百萬為...