摘要:我們在《從串行到并行,從并行到分布式》中无切,對串行刹孔、并行啡省、并發(fā)和分布式進(jìn)行了區(qū)分,并引出了分布式計(jì)算框架MapReduce髓霞。在這篇文章中我們會對MapReduce(Hadoop 2.x的版本)的概念卦睹、執(zhí)行流程、工作原理進(jìn)行深入探討方库。
1. 概念
百度百科對MapReduce的定義感覺還是比較全面的:
MapReduce是面向大數(shù)據(jù)并行處理的計(jì)算模型结序、框架和平臺,它隱含了以下三層含義:
1)MapReduce是一個基于集群的高性能并行計(jì)算平臺纵潦。它允許用市場上普通的商用服務(wù)器構(gòu)成一個包含數(shù)十徐鹤、數(shù)百至數(shù)千個節(jié)點(diǎn)的分布和并行計(jì)算集群。
2)MapReduce是一個并行計(jì)算與運(yùn)行軟件框架邀层。它提供了一個龐大但設(shè)計(jì)精良的并行計(jì)算軟件框架返敬,能自動完成計(jì)算任務(wù)的并行化處理,自動劃分計(jì)算數(shù)據(jù)和計(jì)算任務(wù)寥院,在集群節(jié)點(diǎn)上自動分配和執(zhí)行任務(wù)以及收集計(jì)算結(jié)果劲赠,將數(shù)據(jù)分布存儲、數(shù)據(jù)通信秸谢、容錯處理等并行計(jì)算涉及到的很多系統(tǒng)底層的復(fù)雜細(xì)節(jié)交由系統(tǒng)負(fù)責(zé)處理经磅,大大減少了軟件開發(fā)人員的負(fù)擔(dān)。
3)MapReduce是一個并行程序設(shè)計(jì)模型與方法钮追。它借助于函數(shù)式程序設(shè)計(jì)語言Lisp的設(shè)計(jì)思想预厌,提供了一種簡便的并行程序設(shè)計(jì)方法,用Map和Reduce兩個函數(shù)編程實(shí)現(xiàn)基本的并行計(jì)算任務(wù)元媚,提供了抽象的操作和并行編程接口轧叽,以簡單方便地完成大規(guī)模數(shù)據(jù)的編程和計(jì)算處理苗沧。
用自己的話概況一下:
MapReduce是一個基于集群的計(jì)算平臺,是一個簡化分布式編程的計(jì)算框架炭晒,是一個將分布式計(jì)算抽象為Map和Reduce兩個階段的編程模型待逞。(這句話記住了是可以用來裝逼的)
2. 執(zhí)行流程
先上一張MapReduce程序的執(zhí)行流程圖,我們來好好欣賞一下网严。
由圖我們可以看到识樱, MapReduce存在以下4個獨(dú)立的實(shí)體。
1. JobClient:運(yùn)行于client node震束,負(fù)責(zé)將MapReduce程序打成Jar包存儲到HDFS怜庸,并把Jar包的路徑提交到Jobtracker,由Jobtracker進(jìn)行任務(wù)的分配和監(jiān)控垢村。
2. JobTracker:運(yùn)行于name node割疾,負(fù)責(zé)接收J(rèn)obClient提交的Job,調(diào)度Job的每一個子task運(yùn)行于TaskTracker上嘉栓,并監(jiān)控它們宏榕,如果發(fā)現(xiàn)有失敗的task就重新運(yùn)行它。
3. TaskTracker:運(yùn)行于data node侵佃,負(fù)責(zé)主動與JobTracker通信麻昼,接收作業(yè),并直接執(zhí)行每一個任務(wù)馋辈。
4. HDFS:用來與其它實(shí)體間共享作業(yè)文件抚芦。
各實(shí)體間通過以下過程完成一次MapReduce作業(yè)。
- JobClient通過RPC協(xié)議向JobTracker請求一個新應(yīng)用的ID首有,用于MapReduce作業(yè)的ID
- JobTracker檢查作業(yè)的輸出說明燕垃。例如,如果沒有指定輸出目錄或目錄已存在井联,作業(yè)就不提交卜壕,錯誤拋回給JobClient,否則烙常,返回新的作業(yè)ID給JobClient
- JobClient將作業(yè)所需的資源(包括作業(yè)JAR文件轴捎、配置文件和計(jì)算所得得輸入分片)復(fù)制到以作業(yè)ID命名的HDFS文件夾中
- JobClient通過submitApplication()提交作業(yè)
- JobTracker收到調(diào)用它的submitApplication()消息后,進(jìn)行任務(wù)初始化
- JobTracker讀取HDFS上的要處理的文件蚕脏,開始計(jì)算輸入分片侦副,每一個分片對應(yīng)一個TaskTracker
- TaskTracker通過心跳機(jī)制領(lǐng)取任務(wù)(任務(wù)的描述信息)
- TaskTracker讀取HDFS上的作業(yè)資源(JAR包、配置文件等)
- TaskTracker啟動一個java child子進(jìn)程驼鞭,用來執(zhí)行具體的任務(wù)(MapperTask或ReducerTask)
- TaskTracker將Reduce結(jié)果寫入到HDFS當(dāng)中
3. 工作原理
Map任務(wù)處理
- 讀取HDFS中的文件秦驯。每一行解析成一個<k,v>。每一個鍵值對調(diào)用一次map函數(shù)
- 重寫map()挣棕,對第一步產(chǎn)生的<k,v>進(jìn)行處理译隘,轉(zhuǎn)換為新的<k,v>輸出
- 對輸出的key亲桥、value進(jìn)行分區(qū)
- 對不同分區(qū)的數(shù)據(jù),按照key進(jìn)行排序固耘、分組题篷。相同key的value放到一個集合中
5.(可選) 對分組后的數(shù)據(jù)進(jìn)行歸約
Reduce任務(wù)處理
多個map任務(wù)的輸出,按照不同的分區(qū)厅目,通過網(wǎng)絡(luò)復(fù)制到不同的reduce節(jié)點(diǎn)上
對多個map的輸出進(jìn)行合并番枚、排序。
重寫reduce函數(shù)實(shí)現(xiàn)自己的邏輯损敷,對輸入的key葫笼、value處理,轉(zhuǎn)換成新的key嗤锉、value輸出
把reduce的輸出保存到文件中
最后渔欢,請?jiān)试S我打波廣告墓塌,作者開了一個公眾號【大數(shù)據(jù)學(xué)堂】瘟忱,專門分享一些與大數(shù)據(jù)和人工智能等相關(guān)學(xué)習(xí)資料和面試經(jīng)驗(yàn),歡迎您來一起交流學(xué)習(xí)苫幢。