轉自:
http://blog.sina.com.cn/s/blog_7581a4c30102veem.html map階段1. 使用job.setInputFormatClass(TextInputFormat)做為輸入格式。注意輸出應該符合自定義Map中定義的輸出。
2. 進入Mapper的map()方法,生成一個List。
3. 在map階段的最後,會先調用job.
setPartitionerClass()對這個List進行分區,每個分區映射到一個reducer。
4. 每個分區内又調用job.
setSortComparatorClass()設定的key比較函數類排序(如果沒有通過job.setSortComparatorClass()設定key比較函數類,則使用key的實作的compareTo方法)。可以看到,這是一個二次排序。
5. 如果設定了Combiner(job.
setCombinerClass)對output進行一次合并,進而減少對reduce的輸出流量和預處理reduce的input資料。但不一定會執行,對于Combiner執行時機參考Reference[4]。
【說明】以上步驟省略了collect階段、cache階段等細節,更詳細步驟參考Reference[3] reduce階段1. shuffle階段
reducer開始fetch所有映射到這個reducer的map輸出。
2.1 sort階段
再次調用job.
()設定的key比較函數類對所有資料對排序(因為一個reducer接受多個mappers,需要重新排序)。
2.2 secondary sort階段
然後開始構造一個key對應的value疊代器。這時就要用到分組,使用jobjob.
setGroupingComparatorClass()設定的分組函數類。隻要這個比較器比較的兩個key相同,他們就屬于同一個組,它們的value放在一個value疊代器,而這個疊代器的key使用屬于同一個組的所有key的第一個key。
3.reduce階段
最後就是進入Reducer的reduce()方法,reduce()方法的輸入是所有的(key和它的value疊代器)。同樣注意輸入與輸出的類型必須與自定義的Reducer中聲明的一緻。
【注意】reducers的輸出是無序的。