簡介
MapReduce是工作于Hadoop之上的計算模型,可以將一個大型計算任務拆分為多個小的,可以在服務集群運行和計算的小任務,并將各個小任務計算結果匯總為一個計算結果;其過程主要分為Map階段和Reduce階段,MapReduce有1.0版本和2.0版本;
MapReduceV1主要概念:
- JobTracker: 作用是接受任務,計算資源,分配資源與DataNode通信,同時還需要分解作業(yè)以及作業(yè)狀態(tài)監(jiān)控,其中作業(yè)監(jiān)控還包括:TaskTracker狀態(tài)監(jiān)控,作業(yè)狀態(tài)監(jiān)控和任務狀態(tài)監(jiān)控,以便為容錯和決策提供依據(jù);
- TaskTracker:作用是連接JobTracker和Task,可以執(zhí)行JobTask的指令如:運行任務,提交任務,殺死任務等,也可以對任務狀態(tài)進行監(jiān)控,然后將任務信息通過心跳的方式發(fā)送給JobTracker;它們之間通過Avro實現(xiàn)的RPC進行通信;
- Task: 分為MapTask和ReduceTask;
- slots:是Hadoop節(jié)點資源管理的單位,表示具備的計算或者內(nèi)存等資源的容量或者能力;根據(jù)Map或者Reduce劃分為Map Slots和Reduce Slots,分別用來運行Map或者Reduce 任務;
MapReduceV2主要概念:
- job:由客戶端向服務集群提交的一個計算作業(yè);
- task:集群的最小可執(zhí)行單位,一個job可以拆分為多個task;
- ResourceManager:集群計算資源管理器,用于管理整個集群的計算資源,一個集群只有一個ResourceManager,其主要任務是負責應用資源管理(AppicationManager)和作業(yè)的調(diào)度(Scheduler),接收jobSubmitter提交的作業(yè),根據(jù)作業(yè)上下文和從NodeManager收集來的狀態(tài),啟動調(diào)度過程,為每一個ApplicationMaster分配一個Container,同時會根據(jù)ApplicationMaster申請的map和reduce任務資源,分配合適的nodemanager;
- NodeManager: 節(jié)點管理器,管理單臺服務器的計算資源,并會向ResourceManager匯報服務器狀態(tài),有點類似于V1版本中的TaskTracker;
- ApplicationMaster:負責一個job生命周期的所有工作,監(jiān)控job的執(zhí)行情況,包括資源申請和task調(diào)度等;
- Container:資源分配單位(slots的升級版,不需要根據(jù)map和reduce進行劃分,靈活分配),包括一些cpu和內(nèi)存資源;可以理解為一個jvm;
其新老版本架構圖如下:

MRV1&MRV2.jpg
工作原理
MRV1工作流程
MapReduceV1版本執(zhí)行流程圖如下:

MapReduceV1執(zhí)行過程.png
- jobClient運行一個Job;
- 向JobTracker申請一個Job Id;
- JobClient向HDFS上以JobId為名的文件夾上復制運行作業(yè)需要的資源文件,該資源文件包括MapReduce程序打包的.jar程序文件,配置文件以及客戶端計算所得的計算輸入劃分;jar程序一般會有10個備份,同時輸入劃分信息會告訴JobTracker為其創(chuàng)建多少個Map任務;
- JobTracker接收一個job作業(yè)后,會將其放入一個作業(yè)隊列,等待作業(yè)調(diào)度器進行調(diào)度;當調(diào)度器調(diào)度該作業(yè)時會獲取作業(yè)的資源文件,然后根據(jù)輸入劃分信息為每個劃分創(chuàng)建一個Map任務,交個一個TaskTracker進行執(zhí)行,同時TaskTracker會復制jar文件進行運行;對于Map任務和Reduce任務,TaskTracker會根據(jù)主機核數(shù)量和內(nèi)存大小分成固定數(shù)量的map槽和reduce槽,同時分配的TaskTracker必須包含該Map任務所需要處理的數(shù)據(jù)塊,這叫數(shù)據(jù)本地化,而Reduce任務無需考慮數(shù)據(jù)本地化;
5.TaskTracker運行jar程序后,會每個一段時間向JobTracker發(fā)送一個心跳,同時告訴JobTracker任務完成情況;當JobTracker收到最后一個JobTracker發(fā)送來的作業(yè)完成時,它會將該作業(yè)設置為成功,同時展示給用戶;
Yarn執(zhí)行流程
Yarn執(zhí)行job流程如下圖:

Yarn執(zhí)行流程.png
其主要流程有以下幾個步驟組成:
-
作業(yè)提交
- 第一步: 客戶端通過調(diào)用job.waitForCompletion()方法向整個集群提交MapReduces任務;
- 第二步: 客戶端通過getNewApplication方法向ResouceManager申請新應用,成功的話,ResourceManager會返回一個ApplicationId;
- 第三步:客戶端根據(jù)ApplicationId在HDFS上創(chuàng)建一個文件夾用于復制作業(yè)需要的資源文件,包括jar程序包,配置文件,以及輸入split;
- 第四步:客戶端通過submitApplications方法向ResourceManager提交作業(yè);
-
作業(yè)初始化:
- 第五步:ResourceManager在收到submitApplications請求后,會將該請求發(fā)送給scheduler(調(diào)度器),調(diào)度器會分配一個container,用來運行MRAppMaster應用程序,該應用管理器由所在的nodeManager負責監(jiān)控;
- 第六步: MRAppMaster會對作業(yè)進行初始化,創(chuàng)建一些bookkeeping對象來監(jiān)控作業(yè)的進度,獲得任務進度和完成報告
- 第七步:MRAppMaster會從HDFS上獲取輸入split,然后為每個split分配創(chuàng)建一個map任務;
-
資源分配
- 第八步: MRAppMaster會根據(jù)Map和Reduce任務向ResorceManager申請container資源來運行這些任務;這些請求是通過心跳傳輸?shù)?,請求信息中包含Map和Reduce運行的數(shù)據(jù)塊位置信息(如host和rack),資源調(diào)度器收到請求后,會盡量將Map/Reduce任務分配到存儲數(shù)據(jù)塊的節(jié)點或者分配到存有輸入split節(jié)點的機架上的其他節(jié)點;
-
任務執(zhí)行
- 第九步:MRAppMaster會在資源調(diào)度器分配container后,聯(lián)系對應的NodeManager啟動container,運行一個YarnChlid的java應用程序;
- 第十步:YarnChild應用程序會從HDFS上獲取jar文件,作業(yè)配置以及相應的資源文件;
- 第十一步: YarnChild通過.jar程序運行對應的Map或者Reduce任務;
任務執(zhí)行情況上報:Yarn將任務的執(zhí)行情況和狀態(tài)(包括container)上報給MRAppMaster,客戶端定時刷新任務狀態(tài);
作業(yè)完成:作業(yè)完成后,會將作業(yè)狀態(tài)進行清理包括MRAppMaster和Container,以及OutputCommiter上的作業(yè)清理方法也將會被調(diào)用,最后作業(yè)的歷史信息將會被存儲以備查詢;