溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java的Hadoop CombineTextInputFormat小文件切片怎么理解

發(fā)布時間:2021-12-09 14:23:41 來源:億速云 閱讀:185 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Java的Hadoop CombineTextInputFormat小文件切片怎么理解”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

框架默認(rèn)的TextInputFormat切片機制是對任務(wù)按文件規(guī)劃切片,不管文件多小,都會是一個單獨的切片,都會交給一個MapTask,這樣如果有大量小文件,就會產(chǎn)生大量的MapTask,比如有一個2m的文件,但是默認(rèn)分片還是128m,處理效率極其低下。

1、應(yīng)用場景:

CombineTextInputFormat用于小文件過多的場景,它可以將多個小文件從邏輯上規(guī)劃到一個切片中,這樣,多個小文件就可以交給一個MapTask處理,就不至于每個小文件規(guī)劃大的切片了。

2、虛擬存儲切片最大值設(shè)置

CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4m

注意:虛擬存儲切片最大值設(shè)置最好根據(jù)實際的小文件大小情況來設(shè)置具體的值。

3、切片機制

生成切片過程包括:虛擬存儲過程和切片過程二部分。

Java的Hadoop CombineTextInputFormat小文件切片怎么理解

虛擬存儲過程:

獲取輸入目錄下所有文件大小,依次和代碼中設(shè)置的setMaxInputSplitSize值做比較,如果不大于設(shè)置的最大值,邏輯上劃分一個切片。如果輸入文件大于設(shè)置的最大值且大于兩倍,那么以最大值切割一塊切片;當(dāng)剩余數(shù)據(jù)大小超過設(shè)置的最大值且不大于最大值2倍,此時將文件均分成2個虛擬存儲塊(防止出現(xiàn)太小切片)。

例如setMaxInputSplitSize值為5M,輸入文件大小為10.02M,則先邏輯上分成一個5M。剩余的大小為5.02M,如果按照5M邏輯劃分,就會出現(xiàn)0.02M的小的虛擬存儲文件,所以將剩余的5.02M文件切分成(2.51M和2.51M)兩個文件。

切片過程:

(a)  判斷虛擬存儲的文件大小是否大于setMaxInputSplitSize值,大于等于則單獨形成一個切片。

(b)  如果不大于則跟下一個虛擬存儲文件進(jìn)行合并,共同形成一個切片。

(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

CombineTextInputFormat案例實操

1.需求

將輸入的大量小文件合并成一個切片統(tǒng)一處理。

(1)輸入數(shù)據(jù)

準(zhǔn)備4個小文件

(2)期望

期望一個切片處理4個文件

2.實現(xiàn)過程

(1)不做任何處理,運行WordCount案例程序,觀察切片個數(shù)為4。

(2)在WordcountDriver中增加如下代碼,運行程序并觀察運行的切片個數(shù)為3。

(a)驅(qū)動類中添加代碼如下:

// 如果不設(shè)置InputFormat,它默認(rèn)用的是TextInputFormat.classjob.setInputFormatClass(CombineTextInputFormat.class);//虛擬存儲切片最大值設(shè)置4mCombineTextInputFormat.setMaxInputSplitSize(job, 4194304);

(b)運行結(jié)果為3個切片。

(3)在WordcountDriver中增加如下代碼,運行程序并觀察運行的切片個數(shù)為1。

(a)驅(qū)動中添加代碼如下:

// 如果不設(shè)置InputFormat,它默認(rèn)用的是TextInputFormat.classjob.setInputFormatClass(CombineTextInputFormat.class);
//虛擬存儲切片最大值設(shè)置20mCombineTextInputFormat.setMaxInputSplitSize(job, 20971520);

(b)運行結(jié)果為1個切片。

“Java的Hadoop CombineTextInputFormat小文件切片怎么理解”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI