離線數(shù)據(jù)分析平臺(tái)實(shí)戰(zhàn)——070深入理解MapReduce 02
Shuffle階段說明
shuffle階段主要包括map階段的combine磨淌、group、sort颁独、partition以及reducer階段的合并排序铐料。
Map階段通過shuffle后會(huì)將輸出數(shù)據(jù)按照reduce的分區(qū)分文件的保存,
文件內(nèi)容是按照定義的sort進(jìn)行排序好的阳液。
Map階段完成后會(huì)通知ApplicationMaster,然后AM會(huì)通知Reduce進(jìn)行數(shù)據(jù)的拉取宿稀,在拉取過程中進(jìn)行reduce端的shuffle過程趁舀。
用戶自定義Combiner
Combiner可以減少M(fèi)ap階段的中間輸出結(jié)果數(shù),降低網(wǎng)絡(luò)開銷祝沸。
默認(rèn)情況下是沒有Combiner的矮烹。
用戶自定義的Combiner要求是Reducer的子類,以Map的輸出<key,value>作為Combiner的輸入<key,value>和輸出<key,value>罩锐,也就是說Combiner的輸入和輸出必須是一樣的奉狈。
可以通過job.setCombinerClass設(shè)置combiner的處理類,MapReduce框架不保證一定會(huì)調(diào)用該類的方法涩惑。
用戶自定義Partitoner
Partitioner是用于確定map輸出的<key,value>對(duì)應(yīng)的處理reducer是那個(gè)節(jié)點(diǎn)仁期。
默認(rèn)MapReduce任務(wù)reduce個(gè)數(shù)為1個(gè),此時(shí)Partitioner其實(shí)沒有什么效果,但是當(dāng)我們將reduce個(gè)數(shù)修改為多個(gè)的時(shí)候跛蛋,partitioner就會(huì)決定key所對(duì)應(yīng)reduce的節(jié)點(diǎn)序號(hào)(從0開始)熬的。
可以通過job.setPartitionerClass方法指定Partitioner類,默認(rèn)情況下使用HashPartitioner(默認(rèn)調(diào)用key的hashCode方法)赊级。
用戶自定義Group
GroupingComparator是用于將Map輸出的<key,value>進(jìn)行分組組合成<key,List<value>>的關(guān)鍵類押框,直白來講就是用于確定key1和key2是否屬于同一組,如果是同一組理逊,就將map的輸出value進(jìn)行組合橡伞。
要求我們自定義的類實(shí)現(xiàn)自接口RawComparator,可以通過job.setGroupingComparatorClass方法指定比較類晋被。
默認(rèn)情況下使用WritableComparator兑徘,但是最終調(diào)用key的compareTo方法進(jìn)行比較。
用戶自定義Sort
SortComparator是用于將Map輸出的<key,value>進(jìn)行key排序的關(guān)鍵類,直白來講就是用于確定key1所屬組和key2所屬組那個(gè)在前,那個(gè)在后。
要求我們自定義的類實(shí)現(xiàn)自接口RawComparator,可以通過job.setSortComparatorClass方法指定比較類挡闰。默認(rèn)情況下使用WritableComparator,但是最終調(diào)用key的compareTo方法進(jìn)行比較鸠天。
用戶自定義Reducer的Shuffle
在reduce端拉取map的輸出數(shù)據(jù)的時(shí)候烁涌,會(huì)進(jìn)行shuffle(合并排序),MapReduce框架以插件模式提供了一個(gè)自定義的方式牺蹄,我們可以通過實(shí)現(xiàn)接口ShuffleConsumerPlugin
忘伞,并指定參數(shù)mapreduce.job.reduce.shuffle.consumer.plugin.class
來指定自定義的shuffle規(guī)則,但是一般情況下沙兰,直接采用默認(rèn)的類org.apache.hadoop.mapreduce.task.reduce.Shuffle
氓奈。
案例--二次排序
hadoop默認(rèn)只對(duì)key進(jìn)行排序,有時(shí)候我們需要將value部分也進(jìn)行排序鼎天,這種情況下有兩種方式實(shí)現(xiàn)舀奶,第一種,我們將排序放到reducer端進(jìn)行斋射,但是這種方式當(dāng)數(shù)據(jù)量比較大的時(shí)候育勺,會(huì)比較消耗內(nèi)存。
那么另外一種方式就是二次排序罗岖。
二次排序的內(nèi)部實(shí)行其實(shí)是先按照key+value組合的方式進(jìn)行排序涧至,然后根據(jù)單獨(dú)key進(jìn)行分組的一種實(shí)行方式。
要求reducer個(gè)數(shù)為2桑包,而且奇數(shù)到第一個(gè)reducer進(jìn)行處理南蓬,偶數(shù)到第二個(gè)reducer進(jìn)行處理。