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