大資料學習開發技術:MapReduce執行原理

金羅老師發表於2018-11-15

大資料學習開發技術:MapReduce執行原理


MapReduce是一種程式設計模型,用於大規模資料集(大於1TB)的並行運算。MapReduce採用”分而治之”的思想,把對大規模


資料集的操作,分發給一個主節點管理下的各個分節點共同完成,然後透過整合各個節點的中間結果,得到最終結果。簡單地


說,MapReduce就是“任務的分解與結果的彙總”。




上圖中的TaskTracker對應HDFS中的DataNode,

在MapReduce1.x中,用於執行MapReduce任務的機器角色有兩個:一個是JobTracker;另一個是TaskTracker,JobTracker是用於排程工作的,TaskTracker是用於執行工作的。一個Hadoop叢集中只有一臺JobTracker。




流程分析

  1. 在客戶端啟動任務,客戶端向JobTracker請求一個Job ID。


  2. 將執行任務所需要的程式檔案複製到HDFS上,包括MapReduce程式打包的JAR檔案、配置檔案和客戶端計算所得的輸入劃分資訊。這些檔案都存放在JobTracker專門為該任務建立的資料夾中。資料夾名Job ID。

  3. JobTracker接收到任務後,將其放在一個佇列裡,等待排程器對其進行排程,當作業排程器根據自己的排程演算法排程到該任務時,會根據輸入劃分資訊建立N個map任務,並將map任務分配給N個TaskTracker(DataNode)執行。

  4. map任務不是隨隨便便地分配給某個TaskTracker的,這裡有個概念叫:資料本地化(Data-Local)。意思是:將map任務分配給含有該map處理的資料塊的TaskTracker上,同時將程式JAR包複製到該TaskTracker上來執行,這叫“運算移動,資料不移動”。而分配reduce任務時並不考慮資料本地化。

  5. TaskTracker每隔一段時間會給JobTracker傳送一個Heartbeat(心跳),告訴JobTracker它依然在執行,同時心跳中還攜帶著很多的資訊,比如當前map任務完成的進度等資訊。當JobTracker收到作業的最後一個任務完成資訊時,便把該作業設定成“成功”。當JobClient查詢狀態時,它將得知任務已完成,便顯示一條訊息給使用者。

在這裡還是要推薦下我自己建的大資料學習交流群:199427210,群裡都是學大資料開發的,如果你正在學習大資料 ,小編歡迎你加入,大家都是軟體開發黨,不定期分享乾貨(只有大資料軟體開發相關的),包括我自己整理的一份2018最新的大資料進階資料和高階開發教程,歡迎進階中和進想深入大資料的小夥伴加入。

以上是在客戶端、JobTracker、TaskTracker的層次來分析MapReduce的工作原理的,下面我們再細緻一點,從map任務和reduce任務的層次來分析分析吧。




MapReduce執行流程

以wordcount為例,執行的詳細流程圖如下

1.split階段

首先mapreduce會根據要執行的大檔案來進行split,每個輸入分片(input split)針對一個map任務,輸入分片(input split)儲存的並非資料本身,而是一個分片長度和一個記錄資料位置的陣列。輸入分片(input split)往往和HDFS的block(塊)關係很密切,假如我們設定HDFS的塊的大小是64MB,我們執行的大檔案是64x10M,mapreduce會分為10個map任務,每個map任務都存在於它所要計算的block(塊)的DataNode上。


2.map階段

map階段就是程式設計師編寫的map函式了,因此map函式效率相對好控制,而且一般map操作都是本地化操作也就是在資料儲存節點上進行。本例的map函式如下:

  1. publicclassWCMapperextendsMapperLongWritable,Text,Text,IntWritable{@Override

  2. protectedvoidmap(LongWritablekey,Textvalue,Contextcontext)throwsIOException,InterruptedException{

  3. Stringstr=value.toString();

  4. String[]strs=StringUtils.split(str,''); for (Strings:strs){

  5. context.write(newText(s),newIntWritable(1));

  6. }

  7. }

  8. }

根據空格切分單詞,計數為1,生成key為單詞,value為出現1次的map供後續計算。


3.shuffle階段

shuffle階段主要負責將map端生成的資料傳遞給reduce端,因此shuffle分為在map端的過程和在reduce端的執行過程。

先看map端:




  1. map首先進行資料結果資料屬於哪個partition的判斷,其中一個partition對應一個reduce,一般透過key.hash()%reduce個數來實現。

  2. 把map資料寫入到Memory Buffer(記憶體緩衝區),到達80%閥值,開啟溢寫進磁碟過程,同時進行key排序,如果有combiner步驟,則會對相同的key做歸併處理,最終多個溢寫檔案合併為一個檔案。

reduce端:


reduce節點從各個map節點拉取存在磁碟上的資料放到Memory Buffer(記憶體緩衝區),同理將各個map的資料進行合併並存到磁碟,最終磁碟的資料和緩衝區剩下的20%合併傳給reduce階段。


4.reduce階段

reduce對shuffle階段傳來的資料進行最後的整理合併

  1. publicclassWCReducerextendsReducerText,IntWritable,Text,IntWritable{@Override

  2. protectedvoidreduce(Textkey,IterableIntWritablevalues,Contextcontext)throwsIOException,InterruptedException{intsum=0; for (IntWritablei: values ){

  3. sum+=i.get();

  4. }

  5. context.write( key ,newIntWritable(sum));

  6. }

  7. }




MapReduce的優缺點

優點:

  1. 易於程式設計;

  2. 良好的擴充套件性;

  3. 高容錯性;

4.適合PB級別以上的大資料的分散式離線批處理。

缺點:

  1. 難以實時計算(MapReduce處理的是儲存在本地磁碟上的離線資料)

  2. 不能流式計算(MapReduce設計處理的資料來源是靜態的)

  3. 難以DAG計算MapReduce這些平行計算大都是基於非迴圈的資料流模型,也就是說,一次計算過程中,不同計算節點之間保持高度並行,這樣的資料流模型使得那些需要反覆使用一個特定資料集的迭代演算法無法高效地執行。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31561003/viewspace-2220128/,如需轉載,請註明出處,否則將追究法律責任。

相關文章