1. 分區partition
每個MapTask的輸出都會被分割爲多個分區,Reducer會根據JobTask維護的映射關係獲取自己應該處理的那一份。
有多少個Reducer,Mapper的輸出就應該有多少個分區。
這個分區動作叫做partition,具體邏輯是由partitioner類實現(用戶可以自定義自己的partitioner),partition的職責就是保證MapTask輸出的數據中具有同類Key的數據進入同一個Reducer進行處理。
3. 三次排序
Mapper輸出階段,緩衝區溢寫時,溢寫結果是分區內排序的。
Shuffle階段,合併溢寫文件時需要分區內排序(歸併排序)。
Copy階段(Reducer輸入階段),從各個Mapper收集過來的數據先入Reducer的緩衝區,溢寫(merge)時整體排序(歸併排序)。