【讀書筆記】《大數(shù)據(jù)技術(shù)體系詳解:原理撑碴,架構(gòu)與實(shí)踐》06.大數(shù)據(jù)計(jì)算引擎篇

批處理引擎MapReduce

MapReduce是一個(gè)經(jīng)典的分布式批處理計(jì)算引擎朝墩,被廣泛應(yīng)用于搜索引擎索引構(gòu)建收苏、大規(guī)模數(shù)據(jù)處理等場(chǎng)景中倒戏,具有易于編程、良好的擴(kuò)展性與容錯(cuò)性以及高吞吐率等特點(diǎn)。
它主要由兩部分組成:編程模型和運(yùn)行時(shí)環(huán)境葛闷。其中淑趾,編程模型為用戶提供了非常易用的編程接口忧陪,用戶只需像編寫串行程序一樣實(shí)現(xiàn)幾個(gè)簡(jiǎn)單的函數(shù)即可實(shí)現(xiàn)一個(gè)分布式程序,而其他比較復(fù)雜的工作评矩,如節(jié)點(diǎn)間的通信阱飘、節(jié)點(diǎn)失效沥匈、數(shù)據(jù)切分等高帖,全部由MapReduce運(yùn)行時(shí)環(huán)境完成,用戶無(wú)需關(guān)心這些細(xì)節(jié)乖阵。
在本章中义起,我們將從產(chǎn)生背景师崎、設(shè)計(jì)目標(biāo)犁罩、編程模型和基本架構(gòu)等方面對(duì)MapReduc引擎進(jìn)行介紹床估。

編程思想

MapReduce模型是對(duì)大量分布式處理問(wèn)題的總結(jié)和抽象,它的核心思想是分而治之谈况,即將一個(gè)分布式計(jì)算過(guò)程拆解成兩個(gè)階段:
第一階段:Map階段碑韵,由多個(gè)可并行執(zhí)行的Map Task構(gòu)成祝闻,主要功能是遗菠,將待處理數(shù)據(jù)集按照數(shù)據(jù)量大小切分成等大的數(shù)據(jù)分片,每個(gè)分片交由一個(gè)任務(wù)處理叭喜。
第二階段:Reduce階段堤框,由多個(gè)可并行執(zhí)行的Reduce Task構(gòu)成,主要功能是爱谁,對(duì)前一階段中各任務(wù)產(chǎn)生的結(jié)果進(jìn)行規(guī)約,得到最終結(jié)果着倾。
MapReduce的出現(xiàn)卡者,使得用戶可以把主要精力放在設(shè)計(jì)數(shù)據(jù)處理算法上客们,至于其他的分布式問(wèn)題底挫,包括節(jié)點(diǎn)間的通信建邓、節(jié)點(diǎn)失效官边、數(shù)據(jù)切分、任務(wù)并行化等罐氨,全部由MapReduce運(yùn)行時(shí)環(huán)境完成,用戶無(wú)需關(guān)心這些細(xì)節(jié)玩徊。
以前面的wordcount為例,用戶只需編寫map()和reduce()兩個(gè)函數(shù)泣棋,即可完成分布式程序的設(shè)計(jì)潭辈,這兩個(gè)函數(shù)作用如下:
? map()函數(shù):獲取給定文件中一行字符串把敢,對(duì)其分詞后谅辣,依次輸出這些單詞桑阶。
? reduce()函數(shù):將相同的詞聚集在一起蚣录,統(tǒng)計(jì)每個(gè)詞出現(xiàn)的總頻率萎河,并將結(jié)果輸出。
以上兩個(gè)函數(shù)與“回調(diào)函數(shù)”類似换可,MapReduce框架將在合適的時(shí)機(jī)主動(dòng)調(diào)用它們沾鳄,并處理與之相關(guān)的數(shù)據(jù)切分译荞、數(shù)據(jù)讀取吞歼、任務(wù)并行化等復(fù)雜問(wèn)題篙骡。

MapReduce編程組件

為了簡(jiǎn)化程序設(shè)計(jì),MapReduce首先對(duì)數(shù)據(jù)進(jìn)行了建模尿褪。MapReduce將待處理數(shù)據(jù)劃分成若干個(gè)InputSplit(簡(jiǎn)稱split)杖玲,它是一個(gè)基本計(jì)算單位摆马《诓桑考慮到HDFS以固定大小的block(默認(rèn)是128MB)為基本單位存儲(chǔ)數(shù)據(jù)伞剑,split與block存在一定的對(duì)應(yīng)關(guān)系黎泣,具體如下圖所示抒倚。
split是一個(gè)邏輯概念托呕,它只包含一些元數(shù)據(jù)信息项郊,比如數(shù)據(jù)起始位置、數(shù)據(jù)長(zhǎng)度差油、數(shù)據(jù)所在節(jié)點(diǎn)等蓄喇,它的劃分方法完全受用戶程序控制妆偏,默認(rèn)情況下钱骂,每個(gè)split對(duì)應(yīng)一個(gè)block罐柳。但需要注意的是,split的多少?zèng)Q定了map task的數(shù)目,因?yàn)槊總€(gè)split會(huì)交由一個(gè)map task處理肮蛹。


Split與Block對(duì)應(yīng)關(guān)系

數(shù)據(jù)在MapReduce引擎中是以<key, value>形式流動(dòng)的:
首先,每個(gè)split中的數(shù)據(jù)會(huì)被轉(zhuǎn)換成一系列<key, value>昆码,交由用戶的map()函數(shù)處理邻储,該函數(shù)進(jìn)一步產(chǎn)生另外一系列<key, value>吨娜,之后宦赠,經(jīng)(按照key)排序分組后勾扭,交給用戶編寫的reduce()函數(shù)處理妙色,最終產(chǎn)生結(jié)果燎斩。總結(jié)起來(lái)笋鄙,MapReduce編程模型實(shí)際上是一種包含5個(gè)步驟的分布式計(jì)算方法:

  1. 迭代(iteration)遍歷輸入數(shù)據(jù)萧落,并將之解析成<key, value>對(duì)找岖。
  2. 將輸入<key, value>對(duì)映射(map)成另外一些<key, value>對(duì)许布。
  3. 依據(jù)key對(duì)中間數(shù)據(jù)進(jìn)行分組(grouping)蜜唾。
  4. 以組為單位對(duì)數(shù)據(jù)進(jìn)行歸約(reduce)袁余。
  5. 迭代(iteration)將最終產(chǎn)生的<key, value>保存到輸出文件中颖榜。
    MapReduce將計(jì)算過(guò)程分解成以上5個(gè)步驟帶來(lái)的最大好處是組件化與并行化掩完。
    為了實(shí)現(xiàn)MapReduce編程模型藤为,Hadoop設(shè)計(jì)了一系列對(duì)外編程接口缅疟,用戶可通過(guò)實(shí)現(xiàn)這些接口完成應(yīng)用程序的開(kāi)發(fā)。
    Hadoop MapReducer對(duì)外提供了5個(gè)可編程組件耘斩,分別是InputFormat括授、Mapper荚虚、Partitioner版述、ReducerOutputFormat渴析,其中Mapper和Reducer跟應(yīng)用程序邏輯相關(guān)俭茧,因此必須由用戶編寫(一個(gè)MapReduce程序可以只有Mapper沒(méi)有Reducer)母债,至于其他幾個(gè)組件场斑,MapReduce引擎內(nèi)置了默認(rèn)實(shí)現(xiàn)漏隐,如果這些默認(rèn)實(shí)現(xiàn)能夠滿足用戶需求青责,則可以直接使用脖隶。
Mapper

Mapper中封裝了應(yīng)用程序的數(shù)據(jù)處理邏輯产阱,為了簡(jiǎn)化接口构蹬,MapReduce要求所有存儲(chǔ)在底層分布式文件系統(tǒng)上的數(shù)據(jù)均要解釋成<key, value>的形式庄敛,并以迭代方式依次交給Mapper中的map函數(shù)處理藻烤,產(chǎn)生另外一些<key, value>怖亭。


Mapper.map()被調(diào)用關(guān)系

在MapReduce中,key/value對(duì)象可能被寫入磁盤峭跳,或者通過(guò)網(wǎng)絡(luò)傳輸?shù)讲煌瑱C(jī)器上蛀醉,因此它們必須是可序列化的拯刁。為簡(jiǎn)化用戶開(kāi)發(fā)工作量垛玻,MapReduce對(duì)常用的基本類型進(jìn)行了封裝帚桩,使其變得可序列化账嚎,包括IntWritable郭蕉、FloatWritable召锈、LongWritable、BytesWritable、Text等阻肿。用戶可以通過(guò)繼承Writable類實(shí)現(xiàn)自己的可序列化類丛塌。

Reducer

Reducer主要作用是赴邻,基于Mapper產(chǎn)生的結(jié)果進(jìn)行規(guī)約操作姥敛,產(chǎn)生最終結(jié)果彤敛。Map階段產(chǎn)生的數(shù)據(jù)与帆,按照key分片后,被遠(yuǎn)程拷貝給不同的Reduce Task墨榄。Reduce Task按照key對(duì)其排序玄糟,進(jìn)而產(chǎn)生一系列以key為劃分單位的分組,它們迭代被Reducer函數(shù)處理袄秩,進(jìn)而產(chǎn)生最終的<key, value>對(duì)阵翎。
用戶編寫完MapReduce程序后,按照一定的規(guī)則指定程序的輸入和輸出目錄之剧,并提交到Hadoop集群中。作業(yè)在Hadoop中執(zhí)行過(guò)程如圖所示背稼,Hadoop會(huì)將輸入數(shù)據(jù)切分成若干個(gè)split贰军,并將每個(gè)split交給一個(gè)Map Task處理:Map Task以迭代方式從對(duì)應(yīng)的split中解析出一系列<key, value>,并調(diào)用map()函數(shù)處理蟹肘。待數(shù)據(jù)處理完后谓形,Reduce Task將啟動(dòng)多線程遠(yuǎn)程拷貝各自對(duì)應(yīng)的數(shù)據(jù),然后使用基于排序的方法將key相同的數(shù)據(jù)聚集在一起疆前,并調(diào)用reduce()函數(shù)處理,將結(jié)果輸出到文件中聘萨。


WordCount程序運(yùn)行過(guò)程
InputFormat

InputFormat主要用于描述輸入數(shù)據(jù)的格式竹椒,它提供以下兩個(gè)功能:
? 數(shù)據(jù)切分:按照某個(gè)策略將輸入數(shù)據(jù)切分成若干個(gè)split,以便確定Map Task個(gè)數(shù)以及對(duì)應(yīng)的split米辐。
? 為Mapper提供輸入數(shù)據(jù):給定某個(gè)split胸完,能將其解析成一系列<key, value>對(duì)。為了方便用戶編寫MapReduce程序翘贮,Hadoop自帶了一些針對(duì)數(shù)據(jù)庫(kù)和文件的InputFormat實(shí)現(xiàn)赊窥。

Partitioner

Partitioner的作用是對(duì)Mapper產(chǎn)生的中間結(jié)果進(jìn)行分片,以便將同一組的數(shù)據(jù)交給同一個(gè)Reducer處理狸页,它直接影響Reduce階段的負(fù)載均衡锨能。


Partitioner工作原理

MapReduce默認(rèn)采用了HashPartitioner,它實(shí)現(xiàn)了一種基于哈希值的分片方法芍耘,HashPartitioner能夠?qū)ey相同的所有<key, value>交給同一個(gè)Reduce Task處理址遇,適用于絕大部分應(yīng)用場(chǎng)景,用戶也可按照自己的需求定制Partitioner斋竞。

OutputFormat

OutputFormat主要用于描述輸出數(shù)據(jù)的格式倔约,它能夠?qū)⒂脩籼峁﹌ey/value對(duì)寫入特定格式的文件中。Hadoop自帶了很多OutputFormat實(shí)現(xiàn)坝初,它們與InputFormat實(shí)現(xiàn)相對(duì)應(yīng)浸剩,所有基于文件的OutputFormat實(shí)現(xiàn)的基類為FileOutputFormat钾军,并由此派生出一些基于文本文件格式、二進(jìn)制文件格式的或者多輸出的實(shí)現(xiàn)绢要。

Combiner

除了前面講的5個(gè)可編程組件吏恭,MapReduce還允許用戶定制另外一個(gè)組件:Combiner,它是一個(gè)可選的性能優(yōu)化組件袖扛,可看作Map端的local reducer砸泛,如圖所示,它通常跟Reducer的邏輯是一樣的蛆封,運(yùn)行在Map Task中唇礁,主要作用是,對(duì)Mapper輸出結(jié)果做一個(gè)局部聚集惨篱,以減少本地磁盤寫入量和網(wǎng)絡(luò)數(shù)據(jù)傳輸量盏筐,并減少Reducer計(jì)算壓力。


Combiner工作原理

MapReduce作業(yè)生命周期

MapReduce作業(yè)作為一種分布式應(yīng)用程序砸讳,可直接運(yùn)行在Hadoop資源管理系統(tǒng)YARN之上(MapReduce On YARN)琢融。每個(gè)MapReduce應(yīng)用程序由一個(gè)MRAppMaster以及一系列MapTask和ReduceTask構(gòu)成,它們通過(guò)ResourceManager獲得資源簿寂,并由NodeManager啟動(dòng)運(yùn)行漾抬。


MapReduce與YARN.jpg

當(dāng)用戶向YARN中提交一個(gè)MapReduce應(yīng)用程序后,YARN將分兩個(gè)階段運(yùn)行該應(yīng)用程序:第一個(gè)階段是由ResourceManager啟動(dòng)MRAppMaster常遂;第二個(gè)階段是由MRAppMaster創(chuàng)建應(yīng)用程序纳令,為它申請(qǐng)資源,并監(jiān)控它的整個(gè)運(yùn)行過(guò)程克胳,直到運(yùn)行成功平绩。

YARN的工作流程分為以下幾個(gè)步驟:

  1. 用戶向YARN集群提交應(yīng)用程序,該應(yīng)用程序包括以下配置信息:MRAppMaster所在jar包漠另、啟動(dòng)MRAppMaster的命令及其資源需求(CPU捏雌、內(nèi)存等)、用戶程序jar包等笆搓。
  2. ResourceManager為該應(yīng)用程序分配第一個(gè)Container性湿,并與對(duì)應(yīng)的NodeManager通信,要求它在這個(gè)Container中啟動(dòng)應(yīng)用程序的MRAppMaster砚作。
  3. MRAppMaster啟動(dòng)后窘奏,首先向ResourceManager注冊(cè)(告之所在節(jié)點(diǎn)、端口號(hào)以及訪問(wèn)鏈接等)葫录,這樣着裹,用戶可以直接通過(guò)ResourceManager查看應(yīng)用程序的運(yùn)行狀態(tài),之后,為內(nèi)部Map Task和Reduce Task申請(qǐng)資源并運(yùn)行它們骇扇,期間監(jiān)控它們的運(yùn)行狀態(tài)摔竿,直到所有任務(wù)運(yùn)行結(jié)束,即重復(fù)步驟4~7少孝。
  4. MRAppMaster采用輪詢的方式通過(guò)RPC協(xié)議向ResourceManager申請(qǐng)和領(lǐng)取資源继低。
  5. 一旦MRAppMaster申請(qǐng)到(部分)資源后,則通過(guò)一定的調(diào)度算法將資源分配給內(nèi)部的任務(wù)稍走,之后與對(duì)應(yīng)的NodeManager通信袁翁,要求它啟動(dòng)這些任務(wù)。
  6. NodeManager為任務(wù)準(zhǔn)備運(yùn)行環(huán)境(包括環(huán)境變量婿脸、jar包粱胜、二進(jìn)制程序等),并將任務(wù)執(zhí)行命令寫到一個(gè)shell腳本中狐树,并通過(guò)運(yùn)行該腳本啟動(dòng)任務(wù)焙压。
  7. 啟動(dòng)的Map Task或Reduce Task通過(guò)RPC協(xié)議向MRAppMaster匯報(bào)自己的狀態(tài)和進(jìn)度,以讓MRAppMaster隨時(shí)掌握各個(gè)任務(wù)的運(yùn)行狀態(tài)抑钟,從而可以在任務(wù)失敗時(shí)觸發(fā)相應(yīng)的容錯(cuò)機(jī)制涯曲。在應(yīng)用程序運(yùn)行過(guò)程中,用戶可隨時(shí)通過(guò)RPC向MRAppMaster查詢應(yīng)用程序的當(dāng)前運(yùn)行狀態(tài)在塔。
    8.應(yīng)用程序運(yùn)行完成后幻件,MRAppMaster通過(guò)RPC向ResourceManager注銷,并關(guān)閉自己蛔溃。

ResourceManager傲武、NodeManager、MRAppMaster以及MapTask/ReduceTask管理關(guān)系如下圖所示城榛。ResourceManager為MRAppMaster分配資源,并告之NodeManager啟動(dòng)它态兴,MRAppMaster啟動(dòng)后狠持,會(huì)通過(guò)心跳維持與ResourceManager之間的聯(lián)系;MRAppMaster負(fù)責(zé)為MapTask/ReduceTask申請(qǐng)資源瞻润,并通知NodeManager啟動(dòng)它們喘垂,MapTask/ReduceTask啟動(dòng)后,會(huì)通過(guò)心跳維持與MRAppMaster之間的聯(lián)系绍撞,基于以上設(shè)計(jì)機(jī)制正勒,接下來(lái)介紹MapReduce On YARN架構(gòu)的容錯(cuò)性。


MapReduce On YARN組件之間的歸屬關(guān)系.jpg

? YARN:YARN本身具有高度容錯(cuò)性
? MRAppMaster:MRAppMaster由ResourceManager管理傻铣,一旦MRAppMaster因故障掛掉章贞,ResourceManager會(huì)重新為它分配資源,并啟動(dòng)之非洲。重啟后的MRAppMaster需借助上次運(yùn)行時(shí)記錄的信息恢復(fù)狀態(tài)鸭限,包括未運(yùn)行蜕径、正在運(yùn)行和已運(yùn)行完成的任務(wù)。
? MapTask/ReduceTask:任務(wù)由MRAppMaster管理败京,一旦MapTask/ReduceTask因故障掛掉或因程序bug阻塞住兜喻,MRAppMaster會(huì)為之重新申請(qǐng)資源并啟動(dòng)之。

MapTask與ReduceTask

Map Task可以分解成Read赡麦、Map朴皆、Collect、Spill和Combine五個(gè)階段泛粹;
Reduce Task可以分解成Shuffle遂铡、Merge、Sort戚扳、Reduce和Write五個(gè)階段忧便。

在MapReduce計(jì)算框架中,一個(gè)應(yīng)用程序被劃成Map和Reduce兩個(gè)計(jì)算階段帽借,它們分別由一個(gè)或者多個(gè)Map Task和Reduce Task組成珠增。
其中,每個(gè)Map Task處理輸入數(shù)據(jù)集合中的一片數(shù)據(jù)(split)砍艾,產(chǎn)生若干數(shù)據(jù)片段蒂教,并將之寫到本地磁盤上;
而Reduce Task則從每個(gè)MapTask上遠(yuǎn)程拷貝一個(gè)數(shù)據(jù)片段脆荷,經(jīng)分組聚集和規(guī)約后凝垛,將結(jié)果寫到HDFS中。
Map Task與Reduce Task之間的數(shù)據(jù)傳輸采用了pull模型蜓谋。為了提高容錯(cuò)性梦皮,Map Task將中間計(jì)算結(jié)果存放到本地磁盤上,而Reduce Task則通過(guò)HTTP協(xié)議從各個(gè)Map Task端拉忍一馈(pull)相應(yīng)的待處理數(shù)據(jù)剑肯。為了更好地支持大量Reduce Task并發(fā)從MapTask端拷貝數(shù)據(jù),Hadoop采用了Netty作為高性能網(wǎng)絡(luò)服務(wù)器观堂。

MapTask詳細(xì)流程

Map Task的整體計(jì)算流程如圖所示让网,共分為5個(gè)階段,分別是:


Map Task計(jì)算流程.jpg
  1. Read階段:Map Task通過(guò)InputFormat师痕,從split中解析出一系列<key, value>溃睹。
  2. Map階段:將解析出的<key, value>依次交給用戶編寫的map()函數(shù)處理,并產(chǎn)生一系列新的<key, value>胰坟。
  3. Collect階段:在map()函數(shù)中因篇,當(dāng)數(shù)據(jù)處理完成后,一般會(huì)調(diào)用OutputCollector.collect()輸出結(jié)果,在該函數(shù)內(nèi)部惜犀,它將<key, value>劃分成若干個(gè)數(shù)據(jù)分片(通過(guò)調(diào)用Partitioner)铛碑,并寫入一個(gè)環(huán)形內(nèi)存緩沖區(qū)中。
  4. Spill階段:即“溢寫”虽界,當(dāng)環(huán)形緩沖區(qū)滿后汽烦,MapReduce將數(shù)據(jù)寫到本地磁盤上,生成一個(gè)臨時(shí)文件莉御。需要注意的是撇吞,將數(shù)據(jù)寫入本地磁盤之前,先要對(duì)數(shù)據(jù)進(jìn)行一次本地排序礁叔,并在必要時(shí)對(duì)數(shù)據(jù)進(jìn)行合并牍颈、壓縮等操作。

Map Task為何將處理結(jié)果寫入本地磁盤琅关?
該問(wèn)題實(shí)際上包含兩層含義煮岁,即處理結(jié)果為何不寫入內(nèi)存,或者直接發(fā)送給Reduce Task涣易?
首先画机,Map Task不能夠?qū)?shù)據(jù)寫入內(nèi)存,因?yàn)橐粋€(gè)集群中可能會(huì)同時(shí)運(yùn)行多個(gè)作業(yè)新症,且每個(gè)作業(yè)可能分多批運(yùn)行Map Task步氏,顯然,將計(jì)算結(jié)果直接寫入內(nèi)存會(huì)耗光機(jī)器的內(nèi)存徒爹;
其次荚醒,MapReduce采用的是動(dòng)態(tài)調(diào)度策略,這意味著隆嗅,一開(kāi)始只有Map Task執(zhí)行界阁,而Reduce Task則處于未調(diào)度狀態(tài),因此無(wú)法將Map Task計(jì)算結(jié)果直接發(fā)送給Reduce Task胖喳。
將Map Task寫入本地磁盤铺董,使得Reduce Task執(zhí)行失敗時(shí)可直接從磁盤上再次讀取各個(gè)Map Task的結(jié)果,而無(wú)需讓所有Map Task重新執(zhí)行禀晓。
總之,MapTask將處理結(jié)果寫入本地磁盤主要目的是減少內(nèi)存存儲(chǔ)壓力和容錯(cuò)坝锰。

  1. Combine(整合粹懒,合并)階段:當(dāng)所有數(shù)據(jù)處理完成后,Map Task對(duì)所有臨時(shí)文件進(jìn)行一次合并顷级,以確保最終只會(huì)生成一個(gè)數(shù)據(jù)文件凫乖。

每個(gè)Map Task為何最終只產(chǎn)生一個(gè)數(shù)據(jù)文件?
如果每個(gè)Map Task產(chǎn)生多個(gè)數(shù)據(jù)文件(比如每個(gè)Map Task為每個(gè)Reduce Task產(chǎn)生一個(gè)文件),則會(huì)生成大量中間小文件帽芽,這將大大降低文件讀取性能删掀,并嚴(yán)重影響系統(tǒng)擴(kuò)展性(M個(gè)Map Task和R個(gè)Reduce Task可能產(chǎn)生M*R個(gè)小文件)。

ReduceTask詳細(xì)流程

Reduce Task的整體計(jì)算流程如圖所示导街,共分為5個(gè)階段披泪,分別是:


Reduce Task計(jì)算流程.jpg
  1. Shuffle階段:也稱為Copy階段,Reduce Task從各個(gè)Map Task上遠(yuǎn)程拷貝一片數(shù)據(jù)搬瑰,并根據(jù)數(shù)據(jù)分片大小采取不同操作款票,如果其大小超過(guò)一定閾值,則寫到磁盤上泽论,否則直接放到內(nèi)存中艾少。
  2. Merge階段:在遠(yuǎn)程拷貝數(shù)據(jù)的同時(shí),Reduce Task啟動(dòng)了兩個(gè)后臺(tái)線程對(duì)內(nèi)存和磁盤上的文件進(jìn)行合并翼悴,以防止內(nèi)存使用量過(guò)多或磁盤上文件數(shù)目過(guò)多缚够。
  3. Sort階段:按照MapReduce語(yǔ)義,用戶編寫的reduce()函數(shù)輸入數(shù)據(jù)是按key進(jìn)行聚集的一組數(shù)據(jù)鹦赎。為了將key相同的數(shù)據(jù)聚在一起谍椅,Hadoop采用了基于排序的策略,由于各個(gè)MapTask已經(jīng)實(shí)現(xiàn)對(duì)自己的處理結(jié)果進(jìn)行了局部排序钙姊,因此Reduce Task只需對(duì)所有數(shù)據(jù)進(jìn)行一次歸并排序即可毯辅。
  4. Reduce階段:在該階段中,Reduce Task將每組數(shù)據(jù)依次交給用戶編寫的reduce()函數(shù)處理煞额。
  5. Write階段:將reduce()函數(shù)輸出結(jié)果寫到HDFS上思恐。

小結(jié)

MapReduce最初源自于Google,主要被用于搜索引擎索引構(gòu)建膊毁,之后在Hadoop中得到開(kāi)源實(shí)現(xiàn)胀莹。隨著開(kāi)源社區(qū)的推進(jìn)和發(fā)展,已經(jīng)成為一個(gè)經(jīng)典的分布式批處理計(jì)算引擎婚温,被廣泛應(yīng)用于搜索引擎索引構(gòu)建描焰、大規(guī)模數(shù)據(jù)處理等場(chǎng)景中,具有易于編程栅螟、良好的擴(kuò)展性與容錯(cuò)性以及高吞吐率等特點(diǎn)荆秦。它為用戶提供了非常易用的編程接口,用戶只需像編寫串行程序一樣實(shí)現(xiàn)幾個(gè)簡(jiǎn)單的函數(shù)即可實(shí)現(xiàn)一個(gè)分布式程序力图,而其他比較復(fù)雜的工作步绸,如節(jié)點(diǎn)間的通信、節(jié)點(diǎn)失效吃媒、數(shù)據(jù)切分等瓤介,全部由MapReduce運(yùn)行時(shí)環(huán)境完成吕喘,用戶無(wú)需關(guān)心這些細(xì)節(jié)。MapReduce為用戶提供了InputFormat刑桑、Mapper氯质、Partitioner、Reducer和OutputFormat等可編程組件祠斧,用戶可通過(guò)實(shí)現(xiàn)這些組件完成分布式程序設(shè)計(jì)闻察。為了方便非Java程序員編寫程序,MapReduce提供了Hadoop Streaming工具梁肿,用戶可使用任意語(yǔ)言開(kāi)發(fā)Mapper和Reducer蜓陌,大大提高了程序開(kāi)發(fā)效率。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吩蔑,一起剝皮案震驚了整個(gè)濱河市钮热,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烛芬,老刑警劉巖隧期,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異赘娄,居然都是意外死亡仆潮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門遣臼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)性置,“玉大人,你說(shuō)我怎么就攤上這事揍堰∨羟常” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵屏歹,是天一觀的道長(zhǎng)隐砸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蝙眶,這世上最難降的妖魔是什么季希? 我笑而不...
    開(kāi)封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮幽纷,結(jié)果婚禮上式塌,老公的妹妹穿的比我還像新娘。我一直安慰自己友浸,他們只是感情好峰尝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著尾菇,像睡著了一般境析。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上派诬,一...
    開(kāi)封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天劳淆,我揣著相機(jī)與錄音,去河邊找鬼默赂。 笑死沛鸵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缆八。 我是一名探鬼主播曲掰,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奈辰!你這毒婦竟也來(lái)了栏妖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奖恰,失蹤者是張志新(化名)和其女友劉穎吊趾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瑟啃,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡论泛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛹屿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屁奏。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖错负,靈堂內(nèi)的尸體忽然破棺而出坟瓢,到底是詐尸還是另有隱情,我是刑警寧澤湿颅,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布载绿,位于F島的核電站,受9級(jí)特大地震影響油航,放射性物質(zhì)發(fā)生泄漏崭庸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一谊囚、第九天 我趴在偏房一處隱蔽的房頂上張望怕享。 院中可真熱鬧,春花似錦镰踏、人聲如沸函筋。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)跌帐。三九已至首懈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谨敛,已是汗流浹背究履。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脸狸,地道東北人最仑。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像炊甲,于是被迫代替她去往敵國(guó)和親泥彤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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