您好,登錄后才能下訂單哦!
MapReduce計(jì)算框架高級特性程序運(yùn)行并發(fā)度
所謂的并發(fā)度,就是在MapReduce執(zhí)行程序的過程中有多少個map task進(jìn)程和reduce task進(jìn)程,來一起完成程序的處理。
MapReduce就是把業(yè)務(wù)處理邏輯變成分布式來處理。
reduce task 數(shù)量的決定機(jī)制 //全局的聚合操作 由業(yè)務(wù)場景決定
1、業(yè)務(wù)邏輯需要
2、數(shù)據(jù)量大小
設(shè)置方法:
job.setNumReduceTasks(5)
//reduce task的數(shù)量不能夠任意的指定,比如:我們在一大堆的英文文件中,我們要去統(tǒng)計(jì)有多少個單詞,這個時候reduce task在全局 程序執(zhí)行的過程中只能有1個,為什么呢?因?yàn)椋盒枰屗械膍ap task 把所有的結(jié)果給到一個reduce task 這樣reduce task 就會把所有的結(jié)果統(tǒng)計(jì)出來。在這種情況下reduce task就沒辦法用多個。
比如:在wordcount中,我們統(tǒng)計(jì)每一個單詞出現(xiàn)的總次數(shù),在這種情況下,reduce task就 可以由任意多個。因?yàn)?,maptask處理的結(jié)果經(jīng)過shuffle階段之后,相同的單詞只會出現(xiàn)在同一個reduce task中。我們可能會得到5個文件,但這5個文件中統(tǒng)計(jì)的單詞數(shù)量是全局唯一的。
map task 數(shù)量的決定機(jī)制:
由于map task 之間沒有協(xié)作關(guān)系,每一個map task 都是各自為政,在map task 的處理中沒法做“全局”性的聚合操作,所以map task 的數(shù)量完全取決于所處理的數(shù)據(jù)量的大小
決定機(jī)制:
對待處理數(shù)據(jù)進(jìn)行“切片”
每一個切片分配一個map task 來處理
Mapreduce 框架中默認(rèn)的切片機(jī)制:
TextInputFormat.getSplits()繼承自FileInputFormat.getSplits()
數(shù)據(jù)切片的思考
1:定義一個切片大?。嚎梢酝ㄟ^參數(shù)來調(diào)節(jié),默認(rèn)情況下等于“hdfs 中設(shè)置的blocksize”,通常是128M //一定程度上會減少網(wǎng)絡(luò)傳輸數(shù)據(jù),但并不是絕對的。
2:獲取輸入數(shù)據(jù)目錄下所有待處理文件List
3:遍歷文件List,逐個逐個文件進(jìn)行切片
for(file:List)
對file 從0 偏移量開始切,每到128M 就構(gòu)成一個切片,比如a.txt(200M),就會被切成兩個切片: a.txt: 0-128M, a.txt :128M-256M 再比如b.txt(80M),就會切成一個切片, b.txt :0-80M
如果要處理的數(shù)據(jù)是大量的小文件,使用上述這種默認(rèn)切片機(jī)制,就會導(dǎo)致大量的切片,從而maptask 進(jìn)程數(shù)特別多,但是每一個切片又非常小,每個maptask 的處理數(shù)據(jù)量就很小,從而,整體的效率會很低。通用解決方案:就是將多個小文件劃分成一個切片;實(shí)現(xiàn)辦法就是自定義一個Inputformat 子類重寫里面的getSplits 方法;
Mapreduce 框架中自帶了一個用于此場景的Inputformat 實(shí)現(xiàn)類:CombineFileInputformat
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。