(94)MR工作流程
本小節(jié)將展示一下整個MapReduce的全工作流程。
Map階段
首先是Map階段:
-
首先,我們有一個待處理文本文件的集合;
-
客戶端開始切片規(guī)劃;
-
客戶端提交各種信息(如切片規(guī)劃文件、代碼文件及其他配置數(shù)據(jù))到y(tǒng)arn;
-
yarn接收信息,計算所需的MapTask數(shù)量(按照切片數(shù));
-
MapTask啟動,讀取輸入文件,默認使用的是TextInputFormat。輸出KV對,以TextInputFormat為例,K是偏移量(行在整個文件的字節(jié)數(shù)),V是這一行的內(nèi)容;
-
TextInputFormat讀取完畢后,將得到的KV對都輸入Mapper(),做自定義業(yè)務(wù)邏輯處理(核心處理部分);
-
Mapper()處理完的數(shù)據(jù),放入outputCollector,也被叫做環(huán)形緩沖區(qū);環(huán)形緩沖區(qū)是位于內(nèi)存中的,其實就是個緩沖數(shù)組,里面每行數(shù)據(jù)是分左右兩部分,右邊一部分是KV數(shù)據(jù)位,存放的是輸入進來的K值和V值,左邊一部分是對應(yīng)的索引數(shù)據(jù),存放的信息有:本行KV對的索引、本行KV對的分區(qū)、keystart以及valuestart;這里的keystart和valuestart都是指數(shù)據(jù)在內(nèi)存中的存儲位置,(keystart~valuestart)表示本行key值的存儲起止位置,而(valuestart~下一行數(shù)據(jù)的keystart)表示本行value值的存儲起止位置,其他行以此類推。
環(huán)形緩沖區(qū)默認大小是100M,它有個有趣的機制用來協(xié)調(diào)寫 + 磁盤持久化。當(dāng)寫滿到80%的時候,環(huán)形緩沖區(qū)會開始進行反向逆寫操作。
什么是反向逆寫呢?
可以結(jié)合數(shù)組做簡單理解,就是假設(shè)數(shù)組有100個位置,即索引位0~99,當(dāng)寫到80%位置,即從索引0開始,到索引79寫完了之后,就開始反向逆寫,從索引99開始往前寫,依次是98/97這樣子。
為什么要這么設(shè)置?
很簡單,當(dāng)寫滿到80%的時候,系統(tǒng)會開啟一個線程,將這80%的數(shù)據(jù)持久化到磁盤,但持久化的同時,一般希望不會影響正常的寫,于是留了20%的空位置,供正常的寫操作。因此是持久化 + 寫,并行運行。
想象一下,如果規(guī)定只有寫滿到100%之后才能持久化到磁盤,或者說溢出到磁盤,那么在它持久化的過程中,整個寫流程就必須暫停,直到持久化完成后,環(huán)形緩沖區(qū)清空后才能繼續(xù)寫,這個時間消耗未免太長,效率太低。這么看的話,它這個80%后開始逆寫的設(shè)置,還挺棒的。
這里有個潛在的問題,就是如果系統(tǒng)寫的很快,在沒有持久化完那80%之前,那20%的空位置就寫滿了,這時候會發(fā)生什么情況?
這時候,寫流程就不得不暫停,直到持久化完成之后再恢復(fù)寫。
-
注意,上一步中持久化,或者說溢寫數(shù)據(jù)之前,會先將數(shù)據(jù)分區(qū)(不同分區(qū)的數(shù)據(jù)在Reduce階段將會被送進不同的ReduceTask)。然后分區(qū)內(nèi)做排序,一般使用快排。
那排序是針對什么來排呢?
不是數(shù)據(jù)的KV,而是數(shù)據(jù)的那幾個索引。
-
將數(shù)據(jù)溢出至文件。注意,單次溢寫的數(shù)據(jù)雖然是寫在一個文件里,但是是分區(qū)且分區(qū)內(nèi)有序的。
-
在數(shù)據(jù)溢出數(shù)次后,我們就有了好幾個文件,接下來我們將這些文件merge,做歸并排序,相當(dāng)于是合并成一個文件,然后將結(jié)果存儲在磁盤。
-
做預(yù)聚合。比如說如果有兩個
<a, 1>
,那可以直接合并成<a, 2>
。當(dāng)然,這一步并不是必要的,可以結(jié)合實際場景具體看是否需要。
到這里,一個MapTask的工作就正式結(jié)束了,其他的MapTask就是重復(fù)以上過程。
Reduce階段
Reduce階段:
-
一般情況下,等所有MapTask任務(wù)都完成后,就會啟動響應(yīng)數(shù)據(jù)的ReduceTask,并告知每個ReduceTask它需要處理的數(shù)據(jù)范圍。
這里說的是一般情況下,實際上我們也可以設(shè)置,等到一部分MapTask完成之后就先啟動幾個ReduceTask做處理,相當(dāng)于Map階段和Reduce階段同時進行。這個比較適合MapTask很多的情況,比如說有100個MapTask,等到100個都執(zhí)行完,才進入Reduce階段,未免太慢了,所以可以這樣并行走。
-
ReduceTask 主動 從MapTask的結(jié)果數(shù)據(jù)中去拉取需要的數(shù)據(jù),然后做合并文件 + 歸并排序。
舉個例子,ReduceTask_1可能會從MapTask_1拉取指定分區(qū)數(shù)據(jù),也會從MapTask_2中拉取該分區(qū)的數(shù)據(jù),這樣的話就會有多個文件,而且雖然每個文件內(nèi)部是有序的(MapTask處理過),但是不同文件之間可能是無序的,因此合并文件 + 歸并排序,是很有必要的。
-
對上一步產(chǎn)生的結(jié)果,一次讀取一組,送進Reducer()去做業(yè)務(wù)邏輯處理。這里的一組是KEY值相同作為一組,因為上一步中已經(jīng)排序過了,所以KEY值相同的會被放在一起,直接取這一組就可以了。
-
分組,暫且不表;
-
Reducer()處理完了之后,由OutputFormat往外輸出,默認是TextOutputFormat,即輸出成文本文件。文章來源:http://www.zghlxwxcb.cn/news/detail-724092.html
這就是整個MR處理的流程。文章來源地址http://www.zghlxwxcb.cn/news/detail-724092.html
參考文獻
- 【尚硅谷大數(shù)據(jù)Hadoop教程,hadoop3.x搭建到集群調(diào)優(yōu),百萬播放】
到了這里,關(guān)于Hadoop3教程(十一):MapReduce的詳細工作流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!