MapReduce詳解

MapReduce處理流程圖

圖解wordcount的MapReduce

詳解Shffle

官方對Shuffle過程的描述

Shuffle我們可以理解為描述著數(shù)據(jù)從map task輸出到reduce task輸入的這段過程。

Shffle目的

在Hadoop這樣的集群環(huán)境中,大部分map task與reduce task的執(zhí)行是在不同的節(jié)點上隶校。當然很多情況下Reduce執(zhí)行時需要跨節(jié)點去拉取其它節(jié)點上的map task結(jié)果蜈漓。如果集群正在運行的job有很多,那么task的正常執(zhí)行對集群內(nèi)部的網(wǎng)絡(luò)資源消耗會很嚴重掌猛。這種網(wǎng)絡(luò)消耗是正常的盏浙,我們不能限制,能做的就是最大化地減少不必要的消耗。還有在節(jié)點內(nèi)废膘,相比于內(nèi)存竹海,磁盤IO對job完成時間的影響也是可觀的。從最基本的要求來說丐黄,我們對Shuffle過程的期望可以有:

  1. 完整地從map task端拉取數(shù)據(jù)到reduce 端斋配。

  2. 在跨節(jié)點拉取數(shù)據(jù)時,盡可能地減少對帶寬的不必要消耗灌闺。

  3. 減少磁盤IO對task執(zhí)行的影響许起。

到這里時,大家可以去想想菩鲜,如果是自己來設(shè)計這段Shuffle過程园细,那么你的設(shè)計目標是什么。能優(yōu)化的地方主要在于減少拉取數(shù)據(jù)的量及盡量使用內(nèi)存而不是磁盤接校。

Map階段


上圖是某個map task的運行情況猛频。圖中清楚的指出partition、sort與combiner到底作用在哪個階段蛛勉。從這個圖鹿寻,可以清晰的了解map數(shù)據(jù)輸出到map端所有數(shù)據(jù)準被好的全過程。

整個流程分為四步诽凌。簡單可這樣說毡熏,每個map task都有一個內(nèi)存緩沖區(qū),存儲著map的輸出結(jié)果侣诵,當緩沖區(qū)快滿的時候需要將緩沖區(qū)的數(shù)據(jù)以一個臨時文件的方式存放到磁盤痢法,當整個map task 結(jié)束后在對磁盤中這個map task 產(chǎn)生的所有臨時文件合并,生成最終的正式輸出文件杜顺,然后等待reduce task來拉數(shù)據(jù)财搁。

其實每一步都包含著多個步驟與細節(jié):

  1. 在map task執(zhí)行時,它的輸入數(shù)據(jù)來源于HDFS的block躬络,當然在MapReduce概念中尖奔,map task只讀取split。Split與block的對應(yīng)關(guān)系在上面我們已經(jīng)說的很明白了穷当。在WordCount例子里提茁,假設(shè)map的輸入數(shù)據(jù)都是像 "aaa"這樣的字符串。

  2. 在經(jīng)過mapper的運行后馁菜,我們得知mapper的輸出是這樣一個key/value對: key是"aaa"茴扁, value是數(shù)值1。因為當前map端只做加1的操作火邓,在reduce task里才去合并結(jié)果集丹弱。如果這個job有3個reduce task德撬,到底當前的"aaa"應(yīng)該交由哪個reduce去做呢,是需要現(xiàn)在決定的躲胳。
    MapReduce提供Partitioner接口蜓洪,它的作用就是根據(jù)key或value及reduce的數(shù)量來決定當前的這對輸出數(shù)據(jù)最終應(yīng)該交由哪個 reduce task處理。默認對key hash后再以reduce task數(shù)量取模坯苹。默認的取模方式只是為了平均reduce的處理能力隆檀,如果用戶自己對Partitioner有需求,可以訂制并設(shè)置到j(luò)ob上粹湃。
    假設(shè)"aaa"經(jīng)過Partitioner后返回0恐仑,也就是這對值應(yīng)當交由第一個reducer來處理。接下來为鳄,需要將數(shù)據(jù)寫入內(nèi)存緩沖區(qū)中裳仆,緩沖區(qū)的作用是批量收集map結(jié)果,減少磁盤IO的影響孤钦。我們的key/value對以及Partition的結(jié)果都會被寫入緩沖區(qū)歧斟。當然寫入之 前,key與value值都會被序列化成字節(jié)數(shù)組偏形。 而整個內(nèi)存緩沖區(qū)就是一個字節(jié)數(shù)組静袖。

  3. 這個內(nèi)存緩沖區(qū)是有大小限制的,默認是100MB俊扭。當map task的輸出結(jié)果很多時队橙,就可能會撐爆內(nèi)存,所以需要在一定條件下將緩沖區(qū)中的數(shù)據(jù)臨時寫入磁盤萨惑,然后重新利用這塊緩沖區(qū)捐康。這個從內(nèi)存往磁盤寫數(shù)據(jù)的過程被稱為Spill,中文可譯為溢寫咒钟。這個溢寫是由單獨線程來完成吹由,不影響往緩沖區(qū)寫map結(jié)果的線程。溢寫線程啟動時不應(yīng)該阻止map 的結(jié)果輸出朱嘴,所以整個緩沖區(qū)有個溢寫的比例spill.percent。這個比例默認是0.8粗合,也就是當緩沖區(qū)的數(shù)據(jù)已經(jīng)達到閾值(buffer size * spill percent = 100MB * 0.8 = 80MB)萍嬉,溢寫線程啟動,鎖定這80MB的內(nèi)存隙疚,執(zhí)行溢寫過程壤追。Map task的輸出結(jié)果還可以往剩下的20MB內(nèi)存中寫,互不影響供屉。
    當溢寫線程啟動后行冰,需要對這80MB空間內(nèi)的key做排序(Sort)溺蕉。排序是MapReduce模型默認的行為,這里的排序也是對序列化的字節(jié)做的排序悼做。
    在這里我們可以想想疯特,因為map task的輸出是需要發(fā)送到不同的reduce端去,而內(nèi)存緩沖區(qū)沒有對將發(fā)送到相同reduce端的數(shù)據(jù)做合并肛走,那么這種合并應(yīng)該是體現(xiàn)是磁盤文件中的漓雅。從官方圖上也可以看到寫到磁盤中的溢寫文件是對不同的reduce端的數(shù)值做過合并。所以溢寫過程一個很重要的細節(jié)在于朽色,如果有很多個 key/value對需要發(fā)送到某個reduce端去邻吞,那么需要將這些key/value值拼接到一塊,減少與partition相關(guān)的索引記錄葫男。
    在針對每個reduce端而合并數(shù)據(jù)時抱冷,有些數(shù)據(jù)可能像這樣:"aaa"/1, "aaa"/1梢褐。對于Wordcount例子旺遮,就是簡單地統(tǒng)計單詞出現(xiàn)的次數(shù),如果在同一個map task的結(jié)果中有很多個像"aaa"一樣出現(xiàn)多次的key利职,我們就應(yīng)該把它們的值合并到一塊趣效,這個過程叫reduce也叫combine。但 MapReduce的術(shù)語中猪贪,reduce只指reduce端執(zhí)行從多個map task取數(shù)據(jù)做計算的過程跷敬。除reduce外,非正式地合并數(shù)據(jù)只能算做combine了热押。其實大家知道的西傀,MapReduce中將Combiner等 同于Reducer。
    如果client設(shè)置過Combiner桶癣,那么現(xiàn)在就是使用Combiner的時候了拥褂。將有相同key的key/value對的value加起來,減少溢寫到磁盤的數(shù)據(jù)量牙寞。Combiner會優(yōu)化MapReduce的中間結(jié)果饺鹃,所以它在整個模型中會多次使用。那哪些場景才能使用Combiner呢间雀?從這里分析悔详,Combiner的輸出是Reducer的輸入,Combiner絕不能改變最終的計算結(jié)果惹挟。所以從我的想法來看茄螃,Combiner只應(yīng)該用于那種 Reduce的輸入key/value與輸出key/value類型完全一致,且不影響最終結(jié)果的場景连锯。比如累加归苍,最大值等用狱。Combiner的使用一定得慎重,如果用好拼弃,它對job執(zhí)行效率有幫助夏伊,反之會影響reduce的最終結(jié)果。

  4. 每次溢寫會在磁盤上生成一個溢寫文件肴敛,如果map的輸出結(jié)果真的很大署海,有多次這樣的溢寫發(fā)生,磁盤上相應(yīng)的就會有多個溢寫文件存在医男。當map task真正完成時砸狞,內(nèi)存緩沖區(qū)中的數(shù)據(jù)也全部溢寫到磁盤中形成一個溢寫文件。最終磁盤中會至少有一個這樣的溢寫文件存在(如果map的輸出結(jié)果很少镀梭,當 map執(zhí)行完成時刀森,只會產(chǎn)生一個溢寫文件),因為最終的文件只有一個报账,所以需要將這些溢寫文件歸并到一起研底,這個過程就叫做Merge。Merge是怎樣的透罢?如前面的例子榜晦,"aaa"從某個map task讀取過來時值是5,從另外一個map 讀取時值是8羽圃,因為它們有相同的key乾胶,所以得merge成group。什么是group朽寞。對于"aaa"就是像這樣的:{"aaa", [5, 8, 2, …]}识窿,數(shù)組中的值就是從不同溢寫文件中讀取出來的,然后再把這些值加起來脑融。請注意喻频,因為merge是將多個溢寫文件合并到一個文件,所以可能也有相同的 key存在肘迎,在這個過程中如果client設(shè)置過Combiner甥温,也會使用Combiner來合并相同的key。
    至此妓布,map端的所有工作都已結(jié)束窿侈,最終生成的這個文件也存放在TaskTracker夠得著的某個本地目錄內(nèi)。每個reduce task不斷地通過RPC從JobTracker那里獲取map task是否完成的信息秋茫,如果reduce task得到通知,獲知某臺TaskTracker上的map task執(zhí)行完成乃秀,Shuffle的后半段過程開始啟動肛著。

Reduce階段


如map 端的細節(jié)圖圆兵,Shuffle在reduce端的過程也能用圖上標明的三點來概括。當前reduce copy數(shù)據(jù)的前提是它要從JobTracker獲得有哪些map task已執(zhí)行結(jié)束枢贿,這段過程不詳述殉农。Reducer在真正運行之前,所有的時間都是在拉取數(shù)據(jù)局荚,做merge超凳,且不斷重復(fù)地在做。如前面的方式一樣耀态,下面我也分段地描述reduce端的Shuffle細節(jié):

  1. Copy過程轮傍,簡單地拉取數(shù)據(jù)。Reduce進程啟動一些數(shù)據(jù)copy線程(Fetcher)首装,通過HTTP方式請求map task所在的TaskTracker獲取map task的輸出文件创夜。因為map task早已結(jié)束,這些文件就歸TaskTracker管理在本地磁盤中仙逻。

  2. Merge階段驰吓。這里的merge如map端的merge動作,只是數(shù)組中存放的是不同map端copy來的數(shù)值系奉。Copy過來的數(shù)據(jù)會先放入內(nèi)存緩沖區(qū)中檬贰,這里的緩沖區(qū)大小要比map端的更為靈活,它基于JVM的heap size設(shè)置缺亮,因為Shuffle階段Reducer不運行翁涤,所以應(yīng)該把絕大部分的內(nèi)存都給Shuffle用。這里需要強調(diào)的是瞬内,merge有三種形 式:1)內(nèi)存到內(nèi)存 2)內(nèi)存到磁盤 3)磁盤到磁盤迷雪。默認情況下第一種形式不啟用。當內(nèi)存中的數(shù)據(jù)量到達一定閾值虫蝶,就啟動內(nèi)存到磁盤的merge章咧。與map 端類似,這也是溢寫的過程能真,這個過程中如果你設(shè)置有Combiner赁严,也是會啟用的,然后在磁盤中生成了眾多的溢寫文件粉铐。第二種merge方式一直在運行疼约,直到?jīng)]有map端的數(shù)據(jù)時才結(jié)束,然后啟動第三種磁盤到磁盤的merge方式生成最終的那個文件蝙泼。

  3. Reducer的輸入文件程剥。不斷地merge后,最后會生成一個"最終文件"汤踏。為什么加引號织鲸?因為這個文件可能存在于磁盤上舔腾,也可能存在于內(nèi)存中。對我們 來說搂擦,當然希望它存放于內(nèi)存中稳诚,直接作為Reducer的輸入,但默認情況下瀑踢,這個文件是存放于磁盤中的扳还。當Reducer的輸入文件已定,整個Shuffle才最終結(jié)束橱夭。然后就是Reducer執(zhí)行氨距,把結(jié)果放到HDFS上。

參考:徹底了解mapreduce核心Shuffle

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徘钥,一起剝皮案震驚了整個濱河市衔蹲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呈础,老刑警劉巖舆驶,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異而钞,居然都是意外死亡沙廉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門臼节,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撬陵,“玉大人,你說我怎么就攤上這事网缝【匏埃” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵粉臊,是天一觀的道長草添。 經(jīng)常有香客問我,道長扼仲,這世上最難降的妖魔是什么远寸? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮屠凶,結(jié)果婚禮上驰后,老公的妹妹穿的比我還像新娘。我一直安慰自己矗愧,他們只是感情好灶芝,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般监署。 火紅的嫁衣襯著肌膚如雪颤专。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天钠乏,我揣著相機與錄音,去河邊找鬼春塌。 笑死晓避,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的只壳。 我是一名探鬼主播俏拱,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吼句!你這毒婦竟也來了锅必?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤惕艳,失蹤者是張志新(化名)和其女友劉穎搞隐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體远搪,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡劣纲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谁鳍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癞季。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖倘潜,靈堂內(nèi)的尸體忽然破棺而出绷柒,到底是詐尸還是另有隱情,我是刑警寧澤涮因,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布废睦,位于F島的核電站,受9級特大地震影響蕊退,放射性物質(zhì)發(fā)生泄漏郊楣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一瓤荔、第九天 我趴在偏房一處隱蔽的房頂上張望净蚤。 院中可真熱鬧,春花似錦输硝、人聲如沸今瀑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽橘荠。三九已至屿附,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哥童,已是汗流浹背挺份。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贮懈,地道東北人匀泊。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像朵你,于是被迫代替她去往敵國和親各聘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Shuffle的正常意思是洗牌或弄亂抡医,Hadoop官網(wǎng)提供了下圖來描述該過程: 但是實際過程比上圖描述的復(fù)雜得多躲因。...
    yannhuang閱讀 728評論 0 1
  • 1 數(shù)據(jù)傾斜調(diào)優(yōu) 1.1 調(diào)優(yōu)概述 有的時候,我們可能會遇到大數(shù)據(jù)計算中一個最棘手的問題——數(shù)據(jù)傾斜忌傻,此時Spar...
    wisfern閱讀 2,934評論 0 23
  • MapReduce框架結(jié)構(gòu)## MapReduce是一個用于大規(guī)模數(shù)據(jù)處理的分布式計算模型MapReduce模型主...
    Bloo_m閱讀 3,730評論 0 4
  • 1. mapreduce 的運行機制(Hadoop 2) 首先看下 mapreduce 在 yarn 中的執(zhí)行流程...
    Java旅行者閱讀 668評論 0 3
  • 在學(xué)生生涯里大脉,我們總會遇到自己無精打采、不想學(xué)習(xí)的時候芯勘。此時的我們箱靴,對吃飯都不感興趣,對游戲都不理不睬荷愕,更何況學(xué)...
    UP毛子閱讀 536評論 4 0