MapReduce工作原理

2022-02-19 01:23:46 字數 1688 閱讀 8029

一切都是從最上方的user program開始的,user program鏈結了mapreduce庫,實現了最基本的map函式和reduce函式。

mapreduce庫先把user program的輸入檔案劃分為m份(m為使用者定義),每乙份通常有16mb到64mb,如圖左方所示分成了split0~4(檔案塊);然後使用fork將使用者程序拷貝到集群內其它機器上。

user program的副本中有乙個稱為master,其餘稱為worker,master是負責排程的,為空閒worker分配作業(map作業或reduce作業),worker數量可由使用者指定的。

被分配了map作業的worker,開始讀取對應檔案塊的輸入資料,map作業數量是由m決定的,和split一一對應;map作業(包含多個map函式)從輸入資料中抽取出鍵值對,每乙個鍵值對都作為引數傳遞給map函式,map函式產生的中間鍵值對被快取在記憶體中。

快取的中間鍵值對會被定期寫入本地磁碟。主控程序知道reduce的個數,比如r個(通常使用者指定)。然後主控程序通常選擇乙個雜湊函式作用於鍵並產生0~r-1個桶編號。map任務輸出的每個鍵都被雜湊起作用,根據雜湊結果將map的結果存放到r個本地檔案中的乙個(後來每個檔案都會指派乙個reduce任務)。

master通知分配了reduce作業的worker它負責的分割槽在什麼位置。當reduce worker把所有它負責的中間鍵值對都讀過來後,先對它們進行排序,使得相同鍵的鍵值對聚集在一起。因為不同的鍵可能會對映到同乙個分割槽也就是同乙個reduce作業(誰讓分割槽少呢),所以排序是必須的。

reduce worker遍歷排序後的中間鍵值對,對於每個唯一的鍵,都將鍵與關聯的值傳遞給reduce函式,reduce函式產生的輸出會新增到這個分割槽的輸出檔案中。

當所有的map和reduce作業都完成了,master喚醒正版的user program,mapreduce函式呼叫返回user program的**。

所有執行完畢後,mapreduce輸出放在了r個分割槽的輸出檔案中(分別對應乙個reduce作業)。使用者通常並不需要合併這r個檔案,而是將其作為輸入交給另乙個mapreduce程式處理。整個過程中,輸入資料是來自底層分布式檔案系統(gfs)的,中間資料是放在本地檔案系統的,最終輸出資料是寫入底層分布式檔案系統(gfs)的。而且我們要注意map/reduce作業和map/reduce函式的區別:map作業處理乙個輸入資料的分片,可能需要呼叫多次map函式來處理每個輸入鍵值對;reduce作業處理乙個分割槽的中間鍵值對,期間要對每個不同的鍵呼叫一次reduce函式,reduce作業最終也對應乙個輸出檔案。

函式說明 pid_t fork(void)

乙個現有程序可以呼叫fork函式建立乙個新程序。由fork建立的新程序被稱為子程序。fork函式被呼叫一次但返回兩次。兩次返回的唯一區別是子程序中返回0值而父程序中返回子程序id。子程序是父程序的副本,它將獲得父程序資料空間、堆、棧等資源的副本。注意,子程序持有的是上述儲存空間的「副本」,這意味著父子程序間不共享這些儲存空間。

MapReduce工作原理

本文的目錄 1.mapreduce作業執行流程 2.map reduce任務中shuffle和排序的過程 mapreduce作業詳細的執行流程 流程分析 1.在客戶端啟動乙個作業。2.向jobtracker請求乙個job id。3.將執行作業所需要的資源檔案複製到hdfs上,包括mapreduce程...

map reduce工作原理

下面的圖來自南京大學計算機系黃宜華老師開設的mapreduce課程的課件,這裡稍作整理和 總結。本文旨在對接觸了mapreduce之後,但是對mapreduce的工作流程仍不是很清楚的人員,當然包括博主自己,希望與大家一起學習。mapreduce借鑑了函式式程式語言lisp中的思想,lisp lis...

MapReduce工作原理

map reduce框架的運作完全基於對,即資料的輸入是一批對,生成的結果也是一批對,只是有時候它們的型別不一樣而已。key和value的類由於需要支援被序列化 serialize 操作,所以它們必須要實現writable介面,而且key的類還必須實現writablecomparable介面,使得可...