MapperTask 使用邏輯切片的方式劃分block,調(diào)用InputFormat中的算法進(jìn)行劃分,TextInputFormat默認(rèn)按照128M進(jìn)行劃分(默認(rèn)一個(gè)block至少有一片),每個(gè)分片以行首開頭,以行尾結(jié)尾。
每個(gè)分片對(duì)應(yīng)一個(gè)mapper讀入數(shù)據(jù)后,調(diào)用mapper函數(shù)轉(zhuǎn)換成(k,v)形式,然后按照分區(qū)排序,分批溢寫到磁盤。
Shuffle 從map分區(qū)排序溢寫到reduce拉取數(shù)據(jù)的過程稱為shuffle。
每個(gè)mapTask都有一個(gè)緩存區(qū)域,當(dāng)調(diào)用write方法時(shí),數(shù)據(jù)先寫入到緩存區(qū)域中,數(shù)據(jù)寫滿80%后會(huì)先進(jìn)行分組排序然后溢寫到磁盤,剩下的20%繼續(xù)同步寫入數(shù)據(jù)。
如果定義了combine方法,則這里會(huì)發(fā)生分組內(nèi)的聚合。
一個(gè)mapTask最終會(huì)生成多個(gè)臨時(shí)文件,最后將這些臨時(shí)文件使用歸并排序合并成一個(gè)大文件,并按照分區(qū)器規(guī)則維護(hù)一個(gè)索引文件,在合并過程中也可以發(fā)生分組內(nèi)聚合。
reducerTask數(shù)量由用戶設(shè)定,每個(gè)reducer對(duì)應(yīng)一個(gè)分區(qū)數(shù)據(jù)。
reducer拉取分區(qū)數(shù)據(jù)到本地,一次性讀入一組數(shù)據(jù)執(zhí)行reduce方法,然后按照OutPutFormat的輸出格式將最終結(jié)果輸出到hdfs,每個(gè)reducer對(duì)應(yīng)一個(gè)文件。