MapReduce執行原理

2021-09-01 00:09:01 字數 2941 閱讀 3106

mapreduce是一種程式設計模型,用於大規模資料集(大於1tb)的並行運算。mapreduce採用」分而治之」的思想,把對大規模資料集的操作,分發給乙個主節點管理下的各個分節點共同完成,然後通過整合各個節點的中間結果,得到最終結果。簡單地說,mapreduce就是」任務的分解與結果的彙總」。

mapreduce架構

先來看一下mapreduce1.0的架構圖

上圖中的tasktracker對應hdfs中的datanode,

在mapreduce1.x中,用於執行mapreduce任務的機器角色有兩個:乙個是jobtracker;另乙個是tasktracker,jobtracker是用於排程工作的,tasktracker是用於執行工作的。乙個hadoop集群中只有一台jobtracker。

流程分析

在客戶端啟動任務,客戶端向jobtracker請求乙個job id。

將執行任務所需要的程式檔案複製到hdfs上,包括mapreduce程式打包的jar檔案、配置檔案和客戶端計算所得的輸入劃分資訊。這些檔案都存放在jobtracker專門為該任務建立的資料夾中。資料夾名job id。

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

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

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

以上是在客戶端、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函式如下:

protectedvoidmap(longwritablekey,textvalue,contextcontext)throwsioexception,interruptedexception  

}  } 

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

3.shuffle階段

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

先看map端:

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

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

reduce端:

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

4.reduce階段

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

publicclasswcreducerextendsreducertext,intwritable,text,intwritable  

context.write(key,newintwritable(sum));  

}  } 

mapreduce的優缺點

優點:易於程式設計;

良好的擴充套件性;

高容錯性;

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

缺點:難以實時計算(mapreduce處理的是儲存在本地磁碟上的離線資料)

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

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

MapReduce的執行原理

每個map上建立乙個split資料,預設和block大小相同,每乙個split都會由乙個map task進行處理,從block中讀取出每一行的資料會變成乙個個的鍵值對。接下來,讀取出來的資料都會進入記憶體緩衝區,在進入緩衝區之前,每一條資料都會被打上標籤,這個過程叫做分割槽,由分割槽器來完成,預設的...

MapReduce的原理及執行過程

hadoop mapreduce是乙個軟體框架,基於該框架能夠容易地編寫應用程式,這些應用程式能夠執行在由上千個商用機器組成的大集群上,並以一種可靠的,具有容錯能力的方式並行地處理上tb級別的海量資料集。mapreduce是一種分布式計算模型,是google提出的,主要用於搜尋領域,解決海量資料的計...

MapReduce通俗語言講述執行原理

先假設乙個待解決的問題 如何把乙份300m的檔案,統計到每個單詞的詞頻輸出出來?首先,將這個任務分解為以下幾個大的步驟 把檔案寫進datanode 將計算框架分發到各個datanode,讀取檔案內容並進行計算,這個過程就是mapreduce的過程 將計算完的結果寫進磁碟 從客戶端寫入檔案,涉及到的步...