mapreduce是一種程式設計模式,用於大規模資料的並行運算。「map」,「reduce」是它們的主要思想。使用者用map(對映)函式把一組鍵值對對映成另一組鍵值對,指定併發的reduce(歸納)函式,來保證所有對映的鍵值對中的每乙個共享共同的鍵組。
工作原理:
如上圖:
右圖是**裡給出的流程圖。一切都是從最上方的user program開始的,user program鏈結了mapreduce庫,實現了最基本的map函式和reduce函式。圖中執行的順序都用數字標記了。
1.mapreduce庫先把user program的輸入檔案劃分為m份(m為使用者定義),每乙份通常有16mb到64mb,如圖左方所示分成了split0~4;然後使用fork將使用者程序拷貝到集群內其它機器上。
2.user program的副本中有乙個稱為master,其餘稱為worker,master是負責排程的,為空閒worker分配作業(map作業或者reduce作業),worker的數量也是可以由使用者指定的。
3.被分配了map作業的worker,開始讀取對應分片的輸入資料,map作業數量是由m決定的,和split一一對應;map作業從輸入資料中抽取出鍵值對,每乙個鍵值對都作為引數傳遞給map函式,map函式產生的中間鍵值對被快取在記憶體中。
4.快取的中間鍵值對會被定期寫入本地磁碟,而且被分為r個區,r的大小是由使用者定義的,將來每個區會對應乙個reduce作業;這些中間鍵值對的位置會被通報給master,master負責將資訊**給reduce worker。
5.master通知分配了reduce作業的worker它負責的分割槽在什麼位置(肯定不止乙個地方,每個map作業產生的中間鍵值對都可能對映到所有r個不同分割槽),當reduce worker把所有它負責的中間鍵值對都讀過來後,先對它們進行排序,使得相同鍵的鍵值對聚集在一起。因為不同的鍵可能會對映到同乙個分割槽也就是同乙個reduce作業(誰讓分割槽少呢),所以排序是必須的。
6.reduce worker遍歷排序後的中間鍵值對,對於每個唯一的鍵,都將鍵與關聯的值傳遞給reduce函式,reduce函式產生的輸出會新增到這個分割槽的輸出檔案中。
7.當所有的map和reduce作業都完成了,master喚醒正版的user program,mapreduce函式呼叫返回user program的**。
所有執行完畢後,mapreduce輸出放在了r個分割槽的輸出檔案中(分別對應乙個reduce作業)。使用者通常並不需要合併這r個檔案,而是將其作為輸入交給另乙個mapreduce程式處理。整個過程中,輸入資料是來自底層分布式檔案系統(gfs)的,中間資料是放在本地檔案系統的,最終輸出資料是寫入底層分布式檔案系統(gfs)的。而且我們要注意map/reduce作業和map/reduce函式的區別:map作業處理乙個輸入資料的分片,可能需要呼叫多次map函式來處理每個輸入鍵值對;reduce作業處理乙個分割槽的中間鍵值對,期間要對每個不同的鍵呼叫一次reduce函式,reduce作業最終也對應乙個輸出檔案。
Mapreduce學習筆記(二)
今天來談一談,shuffle過程,shuffle中文翻譯是洗牌,是在map 和reduce之間的一套可編寫程式,就像可插拔的元件一樣,我們可以編寫一些程式來替換它們,以達到我們的需求目的。以下是詳細的shuffle過程。partition 是實現對檔案的分類輸出,如下圖,實現按年份不同將結果輸出到不...
MapReduce學習筆記 2
同樣,hadoop預定義了一些非常有用的reducer類 預設的做法是對key進行雜湊來確定reducer,hadoop通過hashpartitioner類強制執行這個策略。但是有時我們想通過key值中的某個屬性進行排序,而不是key的整體,使用hashpartitioner就會出錯。所以我們需要自...
MapReduce學習筆記之Reduce任務(四)
reduce任務是乙個資料聚合的步驟。數量預設為1,而使用過多的reduce任務則意味著複雜的shuffle,並使輸出檔案的數量激增。mapreduce.job.reduces屬性設定reduce數量,也可以通過程式設計的方式,呼叫job物件的setnumreducetasks 方法來設定。乙個節點...