Hadoop資料分析平臺實戰——070深入理解MapReduce 02(案例)

weixin_34293059發表於2017-08-29

離線資料分析平臺實戰——070深入理解MapReduce 02

Shuffle階段說明

shuffle階段主要包括map階段的combine、group、sort、partition以及reducer階段的合併排序。
Map階段通過shuffle後會將輸出資料按照reduce的分割槽分檔案的儲存,
檔案內容是按照定義的sort進行排序好的。
Map階段完成後會通知ApplicationMaster,然後AM會通知Reduce進行資料的拉取,在拉取過程中進行reduce端的shuffle過程。

使用者自定義Combiner

Combiner可以減少Map階段的中間輸出結果數,降低網路開銷。
預設情況下是沒有Combiner的。
使用者自定義的Combiner要求是Reducer的子類,以Map的輸出<key,value>作為Combiner的輸入<key,value>和輸出<key,value>,也就是說Combiner的輸入和輸出必須是一樣的。

可以通過job.setCombinerClass設定combiner的處理類,MapReduce框架不保證一定會呼叫該類的方法。

使用者自定義Partitoner

Partitioner是用於確定map輸出的<key,value>對應的處理reducer是那個節點。

預設MapReduce任務reduce個數為1個,此時Partitioner其實沒有什麼效果,但是當我們將reduce個數修改為多個的時候,partitioner就會決定key所對應reduce的節點序號(從0開始)。
可以通過job.setPartitionerClass方法指定Partitioner類,預設情況下使用HashPartitioner(預設呼叫key的hashCode方法)。

使用者自定義Group

GroupingComparator是用於將Map輸出的<key,value>進行分組組合成<key,List<value>>的關鍵類,直白來講就是用於確定key1和key2是否屬於同一組,如果是同一組,就將map的輸出value進行組合。
要求我們自定義的類實現自介面RawComparator,可以通過job.setGroupingComparatorClass方法指定比較類。
預設情況下使用WritableComparator,但是最終呼叫key的compareTo方法進行比較。

使用者自定義Sort

SortComparator是用於將Map輸出的<key,value>進行key排序的關鍵類,直白來講就是用於確定key1所屬組和key2所屬組那個在前,那個在後。

要求我們自定義的類實現自介面RawComparator,可以通過job.setSortComparatorClass方法指定比較類。預設情況下使用WritableComparator,但是最終呼叫key的compareTo方法進行比較。

使用者自定義Reducer的Shuffle

在reduce端拉取map的輸出資料的時候,會進行shuffle(合併排序),MapReduce框架以外掛模式提供了一個自定義的方式,我們可以通過實現介面ShuffleConsumerPlugin,並指定引數mapreduce.job.reduce.shuffle.consumer.plugin.class來指定自定義的shuffle規則,但是一般情況下,直接採用預設的類org.apache.hadoop.mapreduce.task.reduce.Shuffle

案例--二次排序

hadoop預設只對key進行排序,有時候我們需要將value部分也進行排序,這種情況下有兩種方式實現,第一種,我們將排序放到reducer端進行,但是這種方式當資料量比較大的時候,會比較消耗記憶體。
那麼另外一種方式就是二次排序。
二次排序的內部實行其實是先按照key+value組合的方式進行排序,然後根據單獨key進行分組的一種實行方式。
要求reducer個數為2,而且奇數到第一個reducer進行處理,偶數到第二個reducer進行處理。

相關文章