注意:
上面的流程是整個(gè)MapReduce最全工作流程,但是Shuffle過程只是從第7步開始到第16步結(jié)束,具體過程詳解如下:
1)準(zhǔn)備一個(gè)文件咏窿,例如ss.txt大小為200M碌秸。
2)上節(jié)學(xué)到,客戶算submit()前旗吁,獲取待處理數(shù)據(jù)的信息踩萎,然后根據(jù)參數(shù)配置,形成一個(gè)個(gè)任務(wù)分配的規(guī)劃很钓。
3)客戶端會(huì)將job.xml香府、xxx.jar、job.xml提交到Y(jié)arn码倦。
4)Yarn開啟Mrappmaster企孩,讀取job.xml文件,計(jì)算出MapTask數(shù)量袁稽,并開啟對(duì)應(yīng)的MapTask勿璃。
5)默認(rèn)用TextInputFormat讀取切片文件,RecorderReader按行讀取文件。
6)InputFormat讀取完數(shù)據(jù)补疑,把數(shù)據(jù)交給自定義mapper歧沪,執(zhí)行邏輯運(yùn)算。
7)MapTask收集我們的map()方法輸出的kv對(duì)莲组,放到環(huán)形緩沖區(qū)中(大小默認(rèn)100M)诊胞。
8)當(dāng)緩沖區(qū)寫到80%后,從內(nèi)存緩沖區(qū)不斷溢出本地磁盤文件锹杈,可能會(huì)溢出多個(gè)文件撵孤。在環(huán)形緩沖區(qū)中,數(shù)據(jù)一開始寫入到不同分區(qū)竭望,分區(qū)內(nèi)文件根據(jù)索引進(jìn)行快排邪码,使得分區(qū)內(nèi)數(shù)據(jù)有序。如果剩余內(nèi)存寫速度大于溢寫速度咬清,那么寫內(nèi)存操作將等待闭专。
9)環(huán)形緩沖區(qū)數(shù)據(jù)溢寫到磁盤(分區(qū)且分區(qū)內(nèi)有序)
10)多個(gè)溢出文件會(huì)被合并成大的溢出文件,將多個(gè)文件的同一個(gè)分區(qū)進(jìn)行歸并排序
11)可以在此 過程進(jìn)行COmbiner合并
10)所有Maptask任務(wù)完成后旧烧,啟動(dòng)相應(yīng)數(shù)量的ReduceTask喻圃,MrAppMaster并告知ReduceTask處理數(shù)據(jù)范圍(數(shù)據(jù)分區(qū))。這里并不是所有任務(wù)完成啟動(dòng)ReduceTask粪滤。
13)Reduce根據(jù)自己的分區(qū)號(hào)斧拍,去各個(gè)MapTask機(jī)器上取相應(yīng)的結(jié)果分區(qū)數(shù)據(jù)
14)將多個(gè)MapTask機(jī)器上結(jié)果分區(qū)數(shù)據(jù)進(jìn)行合并并進(jìn)行歸并排序
15)將數(shù)據(jù)進(jìn)行分組,數(shù)據(jù)向后查杖小,如果后一個(gè)與當(dāng)前key不一致肆汹,則當(dāng)前key和之前數(shù)據(jù)為一組發(fā)送到reducer
16)reducer處理完后,默認(rèn)通過TextOutputFormat寫出結(jié)果數(shù)據(jù)予权。
小結(jié):
Shuffle的緩沖區(qū)大小會(huì)影響到MapReduce程序的執(zhí)行效率昂勉,原則上說,緩沖區(qū)越大扫腺,磁盤IO次數(shù)越少岗照,執(zhí)行速度就越快
緩沖區(qū)的大小可以通過參數(shù)調(diào)箏,參數(shù):mapreduce.task.io.sort.mb默認(rèn)100M笆环。
環(huán)形緩沖區(qū)80%后反向?qū)懺苤粒瑫r(shí)將遠(yuǎn)80%內(nèi)存的文件寫到磁盤。