您好,登錄后才能下訂單哦!
本篇內容介紹了“Java的Hadoop CombineTextInputFormat小文件切片怎么理解”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
框架默認的TextInputFormat切片機制是對任務按文件規劃切片,不管文件多小,都會是一個單獨的切片,都會交給一個MapTask,這樣如果有大量小文件,就會產生大量的MapTask,比如有一個2m的文件,但是默認分片還是128m,處理效率極其低下。
1、應用場景:
CombineTextInputFormat用于小文件過多的場景,它可以將多個小文件從邏輯上規劃到一個切片中,這樣,多個小文件就可以交給一個MapTask處理,就不至于每個小文件規劃大的切片了。
2、虛擬存儲切片最大值設置
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4m
注意:虛擬存儲切片最大值設置最好根據實際的小文件大小情況來設置具體的值。
3、切片機制
生成切片過程包括:虛擬存儲過程和切片過程二部分。
虛擬存儲過程:
獲取輸入目錄下所有文件大小,依次和代碼中設置的setMaxInputSplitSize值做比較,如果不大于設置的最大值,邏輯上劃分一個切片。如果輸入文件大于設置的最大值且大于兩倍,那么以最大值切割一塊切片;當剩余數據大小超過設置的最大值且不大于最大值2倍,此時將文件均分成2個虛擬存儲塊(防止出現太小切片)。
例如setMaxInputSplitSize值為5M,輸入文件大小為10.02M,則先邏輯上分成一個5M。剩余的大小為5.02M,如果按照5M邏輯劃分,就會出現0.02M的小的虛擬存儲文件,所以將剩余的5.02M文件切分成(2.51M和2.51M)兩個文件。
切片過程:
(a) 判斷虛擬存儲的文件大小是否大于setMaxInputSplitSize值,大于等于則單獨形成一個切片。
(b) 如果不大于則跟下一個虛擬存儲文件進行合并,共同形成一個切片。
(c) 測試舉例:有4個小文件大小分別為1.7M、5.1M、3.4M以及6.8M這四個小文件,則虛擬存儲之后形成6個文件塊,大小分別為:
1.7M,(2.55M、2.55M),3.4M 以及(3.4M、3.4M)
(d) 最終會形成3個切片,大小分別為:(1.7+2.55)M,(2.55+3.4)M,(3.4+3.4)M
1.需求
將輸入的大量小文件合并成一個切片統一處理。
(1)輸入數據
準備4個小文件
(2)期望
期望一個切片處理4個文件
2.實現過程
(1)不做任何處理,運行WordCount案例程序,觀察切片個數為4。
(2)在WordcountDriver中增加如下代碼,運行程序并觀察運行的切片個數為3。
(a)驅動類中添加代碼如下:
// 如果不設置InputFormat,它默認用的是TextInputFormat.classjob.setInputFormatClass(CombineTextInputFormat.class);//虛擬存儲切片最大值設置4mCombineTextInputFormat.setMaxInputSplitSize(job, 4194304);
(b)運行結果為3個切片。
(3)在WordcountDriver中增加如下代碼,運行程序并觀察運行的切片個數為1。
(a)驅動中添加代碼如下:
// 如果不設置InputFormat,它默認用的是TextInputFormat.class
job.setInputFormatClass(CombineTextInputFormat.class);
//虛擬存儲切片最大值設置20m
CombineTextInputFormat.setMaxInputSplitSize(job, 20971520);
(b)運行結果為1個切片。
“Java的Hadoop CombineTextInputFormat小文件切片怎么理解”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。