大數(shù)據(jù)學(xué)習(xí)之Hadoop——08Mapreduce執(zhí)行過程詳解

歡迎關(guān)注我的CSDN: https://blog.csdn.net/bingque6535

本文轉(zhuǎn)載于: https://blog.csdn.net/yangshaojun1992/article/details/85003668

一宪躯、分析MapReduce執(zhí)行過程

MapReduce運行的時候,會通過Mapper運行的任務(wù)讀取HDFS中的數(shù)據(jù)文件,然后調(diào)用自己的方法,處理數(shù)據(jù),最后輸出徐块。Reducer任務(wù)會接收Mapper任務(wù)輸出的數(shù)據(jù)此洲,作為自己的輸入數(shù)據(jù)畅厢,調(diào)用自己的方法番宁,最后輸出到HDFS的文件中元莫。整個流程如圖:

在這里插入圖片描述

二、Mapper任務(wù)的執(zhí)行過程詳解

每個Mapper任務(wù)是一個java進程蝶押,它會讀取HDFS中的文件踱蠢,解析成很多的鍵值對,經(jīng)過我們覆蓋的map方法處理后棋电,轉(zhuǎn)換為很多的鍵值對再輸出茎截。整個Mapper任務(wù)的處理過程又可以分為以下幾個階段,如圖所示赶盔。
在這里插入圖片描述

在這里插入圖片描述

在上圖中企锌,把Mapper任務(wù)的運行過程分為六個階段。

  1. 第一階段是把輸入文件按照一定的標準分片(InputSplit)于未,每個輸入片的大小是固定的撕攒。默認情況下,輸入片(InputSplit)的大小與數(shù)據(jù)塊(Block)的大小是相同的烘浦。如果數(shù)據(jù)塊(Block)的大小是默認值64MB抖坪,輸入文件有兩個,一個是32MB闷叉,一個是72MB擦俐。那么小的文件是一個輸入片,大文件會分為兩個數(shù)據(jù)塊握侧,那么是兩個輸入片蚯瞧。一共產(chǎn)生三個輸入片。每一個InputSplit由一個Mapper進程處理品擎。這里的三個輸入片埋合,會有三個Mapper進程處理。

  2. 第二階段是對輸入片中的記錄按照一定的規(guī)則解析成鍵值對孽查。有個默認規(guī)則是把每一行文本內(nèi)容解析成鍵值對饥悴。“鍵”是每一行的起始位置(單位是字節(jié))盲再,“值”是本行的文本內(nèi)容西设。

  3. 第三階段是調(diào)用Mapper類中的map方法。第二階段中解析出來的每一個鍵值對答朋,調(diào)用一次map方法贷揽。如果有1000個鍵值對,就會調(diào)用1000次map方法梦碗。每一次調(diào)用map方法會輸出零個或者多個鍵值對禽绪。

  4. 第四階段是按照一定的規(guī)則對第三階段輸出的鍵值對進行分區(qū)蓖救。分區(qū)是基于鍵進行的。比如我們的鍵表示省份(如北京印屁、上海循捺、山東等),那么就可以按照不同省份進行分區(qū)雄人,同一個省份的鍵值對劃分到一個區(qū)中从橘。默認是只有一個區(qū)。分區(qū)的數(shù)量就是Reducer任務(wù)運行的數(shù)量础钠。默認只有一個Reducer任務(wù)恰力。

  5. 第五階段是對每個分區(qū)中的鍵值對進行排序。首先旗吁,按照鍵進行排序踩萎,對于鍵相同的鍵值對,按照值進行排序很钓。比如三個鍵值對<2,2>香府、<1,3>、<2,1>履怯,鍵和值分別是整數(shù)回还。那么排序后的結(jié)果是<1,3>裆泳、<2,1>叹洲、<2,2>。如果有第六階段工禾,那么進入第六階段运提;如果沒有,直接輸出到本地的linux文件中闻葵。

  6. 第六階段是對數(shù)據(jù)進行歸約處理民泵,也就是reduce處理,通常情況下的Comber過程槽畔,鍵相等的鍵值對會調(diào)用一次reduce方法栈妆,經(jīng)過這一階段,數(shù)據(jù)量會減少厢钧,歸約后的數(shù)據(jù)輸出到本地的linxu文件中鳞尔。本階段默認是沒有的,需要用戶自己增加這一階段的代碼早直。

三. Reducer任務(wù)的執(zhí)行過程詳解

每個Reducer任務(wù)是一個java進程寥假。Reducer任務(wù)接收Mapper任務(wù)的輸出,歸約處理后寫入到HDFS中霞扬,可以分為如下圖所示的幾個階段糕韧。


在這里插入圖片描述
  1. 第一階段是Reducer任務(wù)會主動從Mapper任務(wù)復(fù)制其輸出的鍵值對枫振,Mapper任務(wù)可能會有很多,因此Reducer會復(fù)制多個Mapper的輸出萤彩。

  2. 第二階段是把復(fù)制到Reducer本地數(shù)據(jù)粪滤,全部進行合并,即把分散的數(shù)據(jù)合并成一個大的數(shù)據(jù)雀扶,再對合并后的數(shù)據(jù)排序额衙。

  3. 第三階段是對排序后的鍵值對調(diào)用reduce方法,鍵相等的鍵值對調(diào)用一次reduce方法怕吴,每次調(diào)用會產(chǎn)生零個或者多個鍵值對窍侧,最后把這些輸出的鍵值對寫入到HDFS文件中。

  4. 一個reduce可以處理多組key; 但是相同的key只能由一個reduce處理

四. MapReduce原理

在這里插入圖片描述
  1. 決定Mapper的數(shù)量
    HDFS中數(shù)據(jù)的存儲是以塊的形式存儲的转绷,數(shù)據(jù)塊的切分是物理切分伟件,而split是在Block的基礎(chǔ)上進行的邏輯切分。每一個split對應(yīng)著一個Mapper進程议经。每個Split中的每條記錄調(diào)用一次map方法斧账。
    一個文件被切分成多少個split就有多少個Mapper進程。
  2. 決定Reducer的數(shù)量
    如: 10個key可以有1個reducer煞肾,但是這個reducer只能一次處理一個key咧织,也就是說處理10次
    10個key可以有大于10個reducer ,只不過有的reduce不進行key的處理籍救。
    10個key有10個reducer习绢,這是最合理的分配,達到并行計算蝙昙。
  3. 總結(jié):Mapper階段是并行讀取處理的它的數(shù)量是由切片的數(shù)量決定的闪萄;Reducer階段可以不并行,他的數(shù)量的是通過key進行規(guī)劃奇颠,由人來決定败去。

五. hadoop運行原理之shuffle

1. 原理講解
  1. hadoop的核心思想是MapReduce,但shuffle又是MapReduce的核心烈拒。shuffle的主要工作是從Map結(jié)束到Reduce開始之間的過程圆裕。 首先看下這張圖,就能了解shuffle所處的位置荆几。圖中的partitions吓妆、copy phase、sort phase所代表的就是shuffle的不同階段伴郁。

    在這里插入圖片描述

  2. shuffle被稱作MapReduce的心臟耿战,是MapReduce的核心。

    1. 由上圖看出焊傅,每個數(shù)據(jù)切片由一個Mapper進程處理剂陡,也就是說mappper只是處理文件的一部分狈涮。
    2. 每一個Mapper進程都有一個環(huán)形的內(nèi)存緩沖區(qū),用來存儲Map的輸出數(shù)據(jù)鸭栖,這個內(nèi)存緩沖區(qū)的默認大小是100MB歌馍,當(dāng)數(shù)據(jù)達到闕值0.8,也就是80MB的時候晕鹊,一個后臺的程序就會把數(shù)據(jù)溢寫到磁盤中松却。
    3. 在將數(shù)據(jù)溢寫到磁盤的過程中要經(jīng)過復(fù)雜的過程:
      1. 首先要將數(shù)據(jù)進行分區(qū)排序(按照分區(qū)號如0, 1, 2), 此時緩沖區(qū)中相同的key(可能有多組key)被分在了同一個分區(qū)中, 但是分區(qū)內(nèi)部數(shù)據(jù)是無序的. [粗粒度排序]
      2. 內(nèi)存中進行二次排序, 分區(qū)中相同的key分為一組
      3. 數(shù)據(jù)壓縮,將reduce端的執(zhí)行邏輯,在map端先執(zhí)行, 這樣只需傳遞每個分區(qū)的結(jié)果, 避免進行大量的數(shù)據(jù)傳輸. 例如: 單詞統(tǒng)計時,先對每個分區(qū)中的數(shù)據(jù)進行統(tǒng)計, 然后將統(tǒng)計結(jié)果向后傳遞
      4. 分區(qū)完以后為了避免Map輸出數(shù)據(jù)的內(nèi)存溢出,可以將Map的輸出數(shù)據(jù)分為各個小文件再進行分區(qū)溅话,這樣map的輸出數(shù)據(jù)就會被分為了具有多個小文件的分區(qū)已排序過的數(shù)據(jù)晓锻。
      5. 然后將各個小文件進行歸并排序[標注: 各個文件間無序, 但文件內(nèi)部有序, 所以用歸并排序], 合并成為一個大的文件(將各個小文件中分區(qū)號相同的進行歸并排序)。
      6. 這個時候Reducer啟動了三個分別為0,1,2飞几。0號Reducer會取得0號分區(qū) 的數(shù)據(jù)砚哆;1號Reducer會取得1號分區(qū)的數(shù)據(jù);2號Reducer會取得2號分區(qū)的數(shù)據(jù)屑墨。
2. Map端的shuffle
  1. 在map端首先接觸的是InputSplit躁锁,在InputSplit中含有DataNode中的數(shù)據(jù),每一個InputSplit都會分配一個Mapper任務(wù)卵史,Mapper任務(wù)結(jié)束后產(chǎn)生<K2,V2>的輸出战转,這些輸出先存放在緩存中,每個map有一個環(huán)形內(nèi)存緩沖區(qū)以躯,用于存儲任務(wù)的輸出槐秧。默認大小100MB(io.sort.mb屬性),一旦達到閥值0.8(io.sort.spil l.percent)寸潦,一個后臺線程就把內(nèi)容寫到(spill)Linux本地磁盤中的指定目錄(mapred.local.dir)下的新建的一個溢出寫文件色鸳。
  2. 寫磁盤前,要進行partition见转、sort和combine等操作。通過分區(qū)蒜哀,將不同類型的數(shù)據(jù)分開處理斩箫,之后對不同分區(qū)的數(shù)據(jù)進行排序,如果有Combiner撵儿,還要對排序后的數(shù)據(jù)進行combine乘客。等最后記錄寫完,將全部溢出文件合并為一個分區(qū)且排序的文件淀歇。
  3. 最后將磁盤中的數(shù)據(jù)送到Reduce中易核,從圖中可以看出Map輸出有三個分區(qū),有一個分區(qū)數(shù)據(jù)被送到圖示的Reduce任務(wù)中浪默,剩下的兩個分區(qū)被送到其他Reducer任務(wù)中牡直。而圖示的Reducer任務(wù)的其他的三個輸入則來自其他節(jié)點的Map輸出缀匕。
3. Reduce端的shuffle

Reduce端的shuffle主要包括三個階段,copy碰逸、sort(merge)和reduce乡小。

  1. Copy階段:Reducer通過Http方式得到輸出文件的分區(qū)。
    reduce端可能從n個map的結(jié)果中獲取數(shù)據(jù)饵史,而這些map的執(zhí)行速度不盡相同满钟,當(dāng)其中一個map運行結(jié)束時,reduce就會從JobTracker中獲取該信息胳喷。map運行結(jié)束后TaskTracker會得到消息湃番,進而將消息匯報給JobTracker,reduce定時從JobTracker獲取該信息吭露,reduce端默認有5個數(shù)據(jù)復(fù)制線程從map端復(fù)制數(shù)據(jù)牵辣。

  2. Merge階段:如果形成多個磁盤文件會進行合并
    從map端復(fù)制來的數(shù)據(jù)首先寫到reduce端的緩存中,同樣緩存占用到達一定閾值后會將數(shù)據(jù)寫到磁盤中奴饮,同樣會進行partition纬向、combine、排序等過程戴卜。如果形成了多個磁盤文件還會進行合并逾条,最后一次合并的結(jié)果作為reduce的輸入而不是寫入到磁盤中。

  3. Reducer的參數(shù):最后將合并后的結(jié)果作為輸入傳入Reduce任務(wù)中投剥。
    最后就是Reduce過程了师脂,在這個過程中產(chǎn)生了最終的輸出結(jié)果,并將其寫到HDFS上江锨。

四. 例子

在這里插入圖片描述

本文轉(zhuǎn)載于: https://blog.csdn.net/yangshaojun1992/article/details/85003668

歡迎關(guān)注我的CSDN: https://blog.csdn.net/bingque6535

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吃警,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子啄育,更是在濱河造成了極大的恐慌酌心,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挑豌,死亡現(xiàn)場離奇詭異安券,居然都是意外死亡,警方通過查閱死者的電腦和手機氓英,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門侯勉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铝阐,你說我怎么就攤上這事址貌。” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵练对,是天一觀的道長遍蟋。 經(jīng)常有香客問我,道長锹淌,這世上最難降的妖魔是什么匿值? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮赂摆,結(jié)果婚禮上挟憔,老公的妹妹穿的比我還像新娘。我一直安慰自己烟号,他們只是感情好绊谭,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汪拥,像睡著了一般达传。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迫筑,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天宪赶,我揣著相機與錄音,去河邊找鬼脯燃。 笑死搂妻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辕棚。 我是一名探鬼主播欲主,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逝嚎!你這毒婦竟也來了扁瓢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤补君,失蹤者是張志新(化名)和其女友劉穎引几,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赚哗,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡她紫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了屿储。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡渐逃,死狀恐怖够掠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茄菊,我是刑警寧澤疯潭,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布赊堪,位于F島的核電站,受9級特大地震影響竖哩,放射性物質(zhì)發(fā)生泄漏哭廉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一相叁、第九天 我趴在偏房一處隱蔽的房頂上張望遵绰。 院中可真熱鬧,春花似錦增淹、人聲如沸椿访。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽成玫。三九已至,卻和暖如春拳喻,著一層夾襖步出監(jiān)牢的瞬間哭当,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工冗澈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钦勘,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓渗柿,卻偏偏與公主長得像个盆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子朵栖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354