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