亞寵展、全球?qū)櫸锂a(chǎn)業(yè)風(fēng)向標(biāo)——亞洲寵物展覽會(huì)深度解析
974
2022-05-28
MapReduce 優(yōu)化
Combiner和Partitioner是用來優(yōu)化MapReduce的,可以提高M(jìn)apReduce的運(yùn)行效率。下面我們來具體學(xué)習(xí)這兩個(gè)組件。
Combiner
我們以WordCount為例,首先通過下面的示意圖直觀的了解一下Combiner的位置和作用。
從上圖可以看出,Combiner介于 Mapper和Reducer之間,combine作為 Map任務(wù)的一部分,執(zhí)行完 map 函數(shù)后緊接著執(zhí)行combine,而reduce 必須在所有的 Map 任務(wù)完成后才能進(jìn)行。 而且還可以看出combine的過程與reduce的過程類似,都是對(duì)相同的單詞key合并其詞頻,很多情況下可以直接使用reduce函數(shù)來完成Combiner過程。
通過上面的分析,下面我們將深入理解 Combiner組件。
1、Combiner可以看做局部的Reducer(local reducer)。
1)Combiner作用是合并相同的key對(duì)應(yīng)的value。
2)在Mapper階段,不管Combiner被調(diào)用多少次,都不應(yīng)改變 Reduce的輸出結(jié)果。
3)Combiner通常與Reducer的邏輯是一樣的,一般情況下不需要單獨(dú)編寫Combiner,直接使用Reducer的實(shí)現(xiàn)就可以了。
4)Combiner在Job中是如下設(shè)置的。
job.setCombinerClass(Reducer.class);//Combiner一般情況下,默認(rèn)使用Reducer的實(shí)現(xiàn)
2、Combiner的好處
1)能夠減少M(fèi)ap Task輸出的數(shù)據(jù)量(即磁盤IO)。我們前面提到Map Task 將輸出的數(shù)據(jù)寫到本地磁盤,它輸出的數(shù)據(jù)量越多,它寫入磁盤的數(shù)據(jù)量就越大,那么開銷就越大,速度就越慢。
2)能夠減少Reduce-Map網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量(網(wǎng)絡(luò)IO)。這個(gè)很好理解,Map Task 輸出越少,Reduce從Map結(jié)果中拉取的數(shù)據(jù)量就越少,自然就減少了網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量。
3、Combiner 的使用場景
1)并不是所有的場景都可以使用Combiner,必須滿足結(jié)果可以累加。
2)適合于Sum()求和,并不適合Average()求平均數(shù)。例如,求0、20、10、25和15的平均數(shù),直接使用Reduce求平均數(shù)Average(0,20,10,25,15),得到的結(jié)果是14, 如果先使用Combiner分別對(duì)不同Mapper結(jié)果求平均數(shù),Average(0,20,10)=10,Average(25,15)=20,再使用Reducer求平均數(shù)Average(10,20),得到的結(jié)果為15,很明顯求平均數(shù)并不適合使用Combiner。
Partitioner
我們通過如下示意圖,很直觀的看到 Partitioner 的位置和作用。
從上圖我們可以看出,Partitioner 處于 Mapper階段,當(dāng)Mapper處理好數(shù)據(jù)后,這些數(shù)據(jù)需要經(jīng)過Partitioner進(jìn)行分區(qū),來選擇不同的Reducer處理,從而將Mapper的輸出結(jié)果均勻的分布在Reducer上面執(zhí)行。
通過上面的分析,下面我們將深入理解 Partitioner組件。
1、Partitioner決定了Map Task 輸出的每條數(shù)據(jù)交給哪個(gè)Reduce Task 來處理。Partitioner 有兩個(gè)功能:
1)均衡負(fù)載。它盡量將工作均勻地分配給不同的 Reduce。
2)效率。它的分配速度一定要非常快。
2、Partitioner 的默認(rèn)實(shí)現(xiàn):hash(key) mod R,這里的R代表Reduce Task 的數(shù)目,意思就是對(duì)key進(jìn)行hash處理然后取模。很多情況下,用戶需要自定義 Partitioner,比如“hash(hostname(URL)) mod R”,它確保相同域名下的網(wǎng)頁交給同一個(gè) Reduce Task 來處理。 用戶自定義Partitioner,需要繼承Partitioner類,實(shí)現(xiàn)它提供的一個(gè)方法:
getPartition(Text key, Text value, int numPartitions);
前兩個(gè)參數(shù)分別為Map的key和value。numPartitions 為 Reduce 的個(gè)數(shù),用戶可以自己設(shè)置。
Partitioner 和 Combiner 先后關(guān)系
MapReduce 數(shù)據(jù)傾斜
數(shù)據(jù)分布:
正常的數(shù)據(jù)分布理論上都是傾斜的,就是我們所說的20-80原理:80%的財(cái)富集中在20%的人手中, 80%的用戶只使用20%的功能 , 20%的用戶貢獻(xiàn)了80%的訪問量 。
產(chǎn)生原因:
Mapreduce程序在運(yùn)行的時(shí)候,運(yùn)行了大部分,但是還有部分reduce還在運(yùn)行,甚至長時(shí)間運(yùn)行,最終導(dǎo)致整個(gè)程序運(yùn)行時(shí)間很長才結(jié)束。
造成這種現(xiàn)象的主要原因是:
reduce程序處理的key的條數(shù)比其他key的條數(shù)大很多,這也就造成了分配到數(shù)據(jù)巨大的key的節(jié)點(diǎn)長時(shí)間運(yùn)行。本質(zhì)講數(shù)據(jù)傾斜就是數(shù)據(jù)分布不均。
出現(xiàn)場景:
不同的數(shù)據(jù)字段可能的數(shù)據(jù)傾斜一般有兩種情況:
一種是唯一值非常少,極少數(shù)值有非常多的記錄值(唯一值少于幾千)
一種是唯一值比較多,這個(gè)字段的某些值有遠(yuǎn)遠(yuǎn)多于其他值的記錄數(shù),但是它的占比也小于百分之一或千分之一
解決方案:
方式1:增加reduce 的jvm內(nèi)存
既然reduce 本身的計(jì)算需要以合適的內(nèi)存作為支持,在硬件環(huán)境容許的情況下,增加reduce 的內(nèi)存大小顯然有改善數(shù)據(jù)傾斜的可能,這種方式尤其適合數(shù)據(jù)分布第一種情況,單個(gè)值有大量記錄, 這種值的所有紀(jì)錄已經(jīng)超過了分配給reduce 的內(nèi)存,無論你怎么樣分區(qū)這種情況都不會(huì)改變。
方式2: 增加reduce 個(gè)數(shù)
這個(gè)對(duì)于數(shù)據(jù)分布第二種情況有效,唯一值較多,單個(gè)唯一值的記錄數(shù)不會(huì)超過分配給reduce 的內(nèi)存. 如果發(fā)生了偶爾的數(shù)據(jù)傾斜情況,增加reduce 個(gè)數(shù)可以緩解偶然情況下的某些reduce 不小心分配了多個(gè)較多記錄數(shù)的情況. 但是對(duì)于第一種數(shù)據(jù)分布無效。
方式3: 自定義partition
如果map輸出鍵的單詞來源于一本書。其中大部分必然是省略詞(stopword: a,the,or )。那么就可以將自定義分區(qū)將這部分省略詞發(fā)送給固定的一部分reduce實(shí)例。而將其他的都發(fā)送給剩余的reduce實(shí)例。
方式4:設(shè)定combiner
減少流向reduce的文件數(shù)量,從而減輕reduce數(shù)據(jù)傾斜。
網(wǎng)絡(luò) MapReduce
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。