MapReduce的流程

MapTask工作機制

簡單概述:input?File通過split被邏輯切分為多個split文件腰鬼,通過Record按行讀取內(nèi)容給map(用戶自己實現(xiàn)的)進(jìn)行處理嵌赠,數(shù)據(jù)被map處理結(jié)束之后交給OutputCollector收集器,對其結(jié)果key進(jìn)行分區(qū)(默認(rèn)使用hash分區(qū))熄赡,然后寫入buffer姜挺,每個map task都有一個內(nèi)存緩沖區(qū),存儲著map的輸出結(jié)果彼硫,當(dāng)緩沖區(qū)快滿的時候需要將緩沖區(qū)的數(shù)據(jù)以一個臨時文件的方式存放到磁盤炊豪,當(dāng)整個map task結(jié)束后再對磁盤中這個map task產(chǎn)生的所有臨時文件做合并凌箕,生成最終的正式輸出文件,然后等待reduce task來拉數(shù)據(jù)词渤。

詳細(xì)步驟:

首先牵舱,讀取數(shù)據(jù)組件InputFormat(默認(rèn)TextInputFormat)會通過getSplits方法對輸入目錄中文件進(jìn)行邏輯切片規(guī)劃得到splits,有多少個split就對應(yīng)啟動多少個MapTask缺虐。split與block的對應(yīng)關(guān)系默認(rèn)是一對一芜壁。

將輸入文件切分為splits之后高氮,由RecordReader對象(默認(rèn)LineRecordReader)進(jìn)行讀取慧妄,以\r\n作為分隔符剪芍,讀取一行數(shù)據(jù),返回

讀取split返回

map邏輯完之后罪裹,將map的每條結(jié)果通過context.write進(jìn)行collect數(shù)據(jù)收集饱普。在collect中,會先對其進(jìn)行分區(qū)處理状共,默認(rèn)使用HashPartitioner费彼。

MapReduce提供Partitioner接口口芍,它的作用就是根據(jù)key或value及reduce的數(shù)量來決定當(dāng)前的這對輸出數(shù)據(jù)最終應(yīng)該交由哪個reduce task處理。默認(rèn)對key hash后再以reduce task數(shù)量取模雇卷。默認(rèn)的取模方式只是為了平均reduce的處理能力鬓椭,如果用戶自己對Partitioner有需求,可以訂制并設(shè)置到j(luò)ob上小染。

接下來贮折,會將數(shù)據(jù)寫入內(nèi)存裤翩,內(nèi)存中這片區(qū)域叫做環(huán)形緩沖區(qū)踊赠,緩沖區(qū)的作用是批量收集map結(jié)果,減少磁盤IO的影響筐带。我們的key/value對以及Partition的結(jié)果都會被寫入緩沖區(qū)缤灵。當(dāng)然寫入之前蓝晒,key與value值都會被序列化成字節(jié)數(shù)組帖鸦。

環(huán)形緩沖區(qū)其實是一個數(shù)組,數(shù)組中存放著key作儿、value的序列化數(shù)據(jù)和key、value的元數(shù)據(jù)信息灭红,包括partition口注、key的起始位置、value的起始位置以及value的長度寝志。環(huán)形結(jié)構(gòu)是一個抽象概念。

緩沖區(qū)是有大小限制毫缆,默認(rèn)是100MB。當(dāng)map task的輸出結(jié)果很多時乐导,就可能會撐爆內(nèi)存苦丁,所以需要在一定條件下將緩沖區(qū)中的數(shù)據(jù)臨時寫入磁盤物臂,然后重新利用這塊緩沖區(qū)。這個從內(nèi)存往磁盤寫數(shù)據(jù)的過程被稱為Spill蛾狗,中文可譯為溢寫仪媒。這個溢寫是由單獨線程來完成,不影響往緩沖區(qū)寫map結(jié)果的線程留凭。溢寫線程啟動時不應(yīng)該阻止map的結(jié)果輸出赌莺,所以整個緩沖區(qū)有個溢寫的比例spill.percent。這個比例默認(rèn)是0.8艘狭,也就是當(dāng)緩沖區(qū)的數(shù)據(jù)已經(jīng)達(dá)到閾值(buffer size * spill percent = 100MB * 0.8 =80MB)翠订,溢寫線程啟動遵倦,鎖定這80MB的內(nèi)存梧躺,執(zhí)行溢寫過程。Map task的輸出結(jié)果還可以往剩下的20MB內(nèi)存中寫掠哥,互不影響。?

當(dāng)溢寫線程啟動后塞琼,需要對這80MB空間內(nèi)的key做排序(Sort)禁舷。排序是MapReduce模型默認(rèn)的行為,這里的排序也是對序列化的字節(jié)做的排序派近。

如果job設(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é)果。

每次溢寫會在磁盤上生成一個臨時文件(寫之前判斷是否有combiner)页慷,如果map的輸出結(jié)果真的很大,有多次這樣的溢寫發(fā)生滓彰,磁盤上相應(yīng)的就會有多個臨時文件存在州袒。當(dāng)整個數(shù)據(jù)處理結(jié)束之后開始對磁盤中的臨時文件進(jìn)行merge合并,因為最終的文件只有一個他匪,寫入磁盤夸研,并且為這個文件提供了一個索引文件,以記錄每個reduce對應(yīng)數(shù)據(jù)的偏移量悼沈。?

至此map整個階段結(jié)束姐扮。

Shuffle機制

1).Collect階段:將MapTask的結(jié)果輸出到默認(rèn)大小為100M的環(huán)形緩沖區(qū),保存的是key/value茶敏,Partition分區(qū)信息等惊搏。

2).Spill階段:當(dāng)內(nèi)存中的數(shù)據(jù)量達(dá)到一定的閥值的時候忧换,就會將數(shù)據(jù)寫入本地磁盤塘揣,在將數(shù)據(jù)寫入磁盤之前需要對數(shù)據(jù)進(jìn)行一次排序的操作,如果配置了combiner才写,還會將有相同分區(qū)號和key的數(shù)據(jù)進(jìn)行排序奖蔓。?

3).Merge階段:把所有溢出的臨時文件進(jìn)行一次合并操作,以確保一個MapTask最終只產(chǎn)生一個中間數(shù)據(jù)文件吆鹤。

4).Copy階段:ReduceTask啟動Fetcher線程到已經(jīng)完成MapTask的節(jié)點上復(fù)制一份屬于自己的數(shù)據(jù)疑务,這些數(shù)據(jù)默認(rèn)會保存在內(nèi)存的緩沖區(qū)中,當(dāng)內(nèi)存的緩沖區(qū)達(dá)到一定的閥值的時候知允,就會將數(shù)據(jù)寫到磁盤之上。

5).Merge階段:在ReduceTask遠(yuǎn)程復(fù)制數(shù)據(jù)的同時保屯,會在后臺開啟兩個線程對內(nèi)存到本地的數(shù)據(jù)文件進(jìn)行合并操作涤垫。

6).Sort階段:在對數(shù)據(jù)進(jìn)行合并的同時,會進(jìn)行排序操作切蟋,由于MapTask階段已經(jīng)對數(shù)據(jù)進(jìn)行了局部的排序榆芦,ReduceTask只需保證Copy的數(shù)據(jù)的最終整體有效性即可。

Shuffle中的緩沖區(qū)大小會影響到mapreduce程序的執(zhí)行效率,原則上說迷守,緩沖區(qū)越大兑凿,磁盤io的次數(shù)越少茵瘾,執(zhí)行速度就越快

緩沖區(qū)的大小可以通過參數(shù)調(diào)整, ?參數(shù):io.sort.mb ?默認(rèn)100M

ReduceTask工作機制

Reduce大致分為copy咐鹤、sort、reduce三個階段雕旨,重點在前兩個階段捧请。copy階段包含一個eventFetcher來獲取已完成的map列表,由Fetcher線程去copy數(shù)據(jù)疹蛉,在此過程中會啟動兩個merge線程,分別為inMemoryMerger和onDiskMerger可款,分別將內(nèi)存中的數(shù)據(jù)merge到磁盤和將磁盤中的數(shù)據(jù)進(jìn)行merge。待數(shù)據(jù)copy完成之后筋讨,copy階段就完成了翠拣,開始進(jìn)行sort階段,sort階段主要是執(zhí)行finalMerge操作蛮粮,純粹的sort階段谜慌,完成之后就是reduce階段,調(diào)用用戶定義的reduce函數(shù)進(jìn)行處理变泄。


詳細(xì)步驟:

Copy階段恼琼,簡單地拉取數(shù)據(jù)。Reduce進(jìn)程啟動一些數(shù)據(jù)copy線程(Fetcher)蛙卤,通過HTTP方式請求maptask獲取屬于自己的文件。

Merge階段颤难。這里的merge如map端的merge動作行嗤,只是數(shù)組中存放的是不同map端copy來的數(shù)值。Copy過來的數(shù)據(jù)會先放入內(nèi)存緩沖區(qū)中栅屏,這里的緩沖區(qū)大小要比map端的更為靈活。merge有三種形式:內(nèi)存到內(nèi)存占婉;內(nèi)存到磁盤甫恩;磁盤到磁盤。默認(rèn)情況下第一種形式不啟用奖慌。當(dāng)內(nèi)存中的數(shù)據(jù)量到達(dá)一定閾值松靡,就啟動內(nèi)存到磁盤的merge。與map 端類似岛马,這也是溢寫的過程屠列,這個過程中如果你設(shè)置有Combiner,也是會啟用的夏志,然后在磁盤中生成了眾多的溢寫文件苛让。第二種merge方式一直在運行,直到?jīng)]有map端的數(shù)據(jù)時才結(jié)束瘦材,然后啟動第三種磁盤到磁盤的merge方式生成最終的文件仿畸。

把分散的數(shù)據(jù)合并成一個大的數(shù)據(jù)后,還會再對合并后的數(shù)據(jù)排序宣蠕。

對排序后的鍵值對調(diào)用reduce方法甥捺,鍵相等的鍵值對調(diào)用一次reduce方法,每次調(diào)用會產(chǎn)生零個或者多個鍵值對皿曲,最后把這些輸出的鍵值對寫入到HDFS文件中吴侦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末备韧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子织堂,更是在濱河造成了極大的恐慌易阳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拒课,死亡現(xiàn)場離奇詭異事示,居然都是意外死亡,警方通過查閱死者的電腦和手機扎酷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門法挨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幅聘,“玉大人,你說我怎么就攤上這事荐糜。” “怎么了暴氏?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵答渔,是天一觀的道長。 經(jīng)常有香客問我宋雏,道長务豺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任蚪燕,我火速辦了婚禮敬拓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厕诡。我一直安慰自己营勤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布寿羞。 她就那樣靜靜地躺著赂蠢,像睡著了一般虱岂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上第岖,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天蔑滓,我揣著相機與錄音遇绞,去河邊找鬼燎窘。 笑死,一個胖子當(dāng)著我的面吹牛钩骇,可吹牛的內(nèi)容都是我干的铝量。 我是一名探鬼主播银亲,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼务蝠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轩拨?” 一聲冷哼從身側(cè)響起院喜,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤喷舀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后硫麻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年券敌,在試婚紗的時候發(fā)現(xiàn)自己被綠了奢赂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡咱士,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锐膜,到底是詐尸還是另有隱情弛房,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布荷逞,位于F島的核電站粹排,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坠敷。R本人自食惡果不足惜射富,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望限次。 院中可真熱鬧柴灯,春花似錦、人聲如沸懊亡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叹誉,卻和暖如春鸯两,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背长豁。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工钧唐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匠襟。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓钝侠,卻偏偏與公主長得像该园,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子帅韧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

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