1、MapReduce執行流程
RecordReader->讀取文件數據,將數據拆分爲kv對
map階段->調用用戶定義程序處理kv對,並對數據進行分區(job.setPartitionerClass)後存儲到“環形內存緩衝區”,
當緩衝區達到一定閾值時(默認80%),會啓動後臺線程將部分數據溢出寫入(spill)磁盤的臨時文件中,
將數據寫入文件前會先進行排序(job.setSortComparatorClass)後執行合併(combine)操作(可選)。
當整個map任務完成溢出寫入(spill)後,會將所有臨時文件執行歸併(merge)操作,生成一個大文件
此時的歸併會將spill文件中所有的相同partition合併到一起,並對每個partition中的數據按照key進行排序(sort)操作,生成key和對應的value-list,文件歸併時,如果溢寫文件數量超過參數min.num.spills.for.combine的值(默認爲3)時,可以再次進行合併(combine)。
reduce階段-> reduce task會從不同的job里拉取map task的最終結果,並將相同的partition數據歸併(merge)成一個大文件,對文件中的數據按key進行排序。
之後會對數據進行分組(job.setGroupingComparatorClass)。之後調用reduce進行數據處理
ps:如果:reduce數=1,所有分區都在一個reduce中處理,生成一個文件
1<reduce數<分區數,會報錯,有的分區找不到處理的reduce
reduce數>分區數,會有本分reduce沒有數據處理,生成空文件
一個分組調用一次reduce()方法
參考:https://blog.csdn.net/asn_forever/article/details/81233547
https://blog.csdn.net/u014374284/article/details/49205885