1. 程式人生 > >圖解mapreduce原理和執行過程

圖解mapreduce原理和執行過程

說明:

下面的圖來自南京大學計算機系黃宜華老師開設的mapreduce課程的課件,這裡稍作整理和 總結。

本文旨在對接觸了mapreduce之後,但是對mapreduce的工作流程仍不是很清楚的人員,當然包括博主自己,希望與大家一起學習。

mapreduce的原理

MapReduce借鑑了函式式程式設計語言Lisp中的思想,Lisp(List processing)是一種列表處理語言,可對列表元素進行整體處理。

如:(add #(1 2 3 4) #(4 3 2 1))   將產生結果:#(5 5 5 5)

mapreduce之所以和lisp類似,是因為mapreduce在最後的 reduce階段也是以key為分組進行列的運算。

下面這幅圖就是mapreduce的工作原理

1)首先文件的資料記錄(如文字中的行,或資料表格中的行)是以“鍵值對”的形式傳入map 函式,然後map函式對這些鍵值對進行處理(如統計詞頻),然後輸出到中間結果。

2)在鍵值對進入reduce進行處理之前,必須等到所有的map函式都做完,所以既為了達到這種同步又提高執行效率,在mapreduce中間的過程引入了barrier(同步障)

在負責同步的同時完成對map的中間結果的統計,包括 a. 對同一個map節點的相同key的value值進行合併b. 之後將來自不同map的具有相同的key的鍵值對送到同一個reduce進行處理

3)在reduce階段,每個reduce節點得到的是從所有map節點傳過來的具有相同的key的鍵值對。reduce節點對這些鍵值進行合併。

以詞頻統計為例。

詞頻統計就是統計一個單詞在所有文字中出現的次數,在Hadoop中的事例程式就是wordcount,俗稱hadoop程式設計的"hello world".

因為我們有多個文字,所以可以並行的統計每個文字中單詞出現的個數,然後最後進行合計。

所以這個可以很好地體現map,reduce的過程。

可以發現,這張圖是上面那張圖的進一步細化,主要體現在:

1)Combiner 節點負責完成上面提到的將同一個map中相同的key進行合併,避免重複傳輸,從而減少傳輸中的通訊開銷。

2)Partitioner節點負責將map產生的中間結果進行劃分,確保相同的key到達同一個reduce節點.