天天看點

Hadoop MapReduce工作詳細流程(Partitioner/SortComparator/GroupingComparator)

轉自:

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的輸出是無序的。

繼續閱讀