我對MapReduce的理解

MapReduce:Simplified Data Processing on Large Clusters

摘要:這篇論文應該算是MapReduce的開山之作,總得來說這篇文章講的內容比較簡單,其實就是介紹了MapReduce的思想,雖然說這個思想簡單,但是能夠直接想到這個思想還是有點難度的。而且,簡單的思想往往就會實現起來比較困難,MapReduce的目的是給用戶提供一個簡單的接口以便用戶(包括沒有並行編程經驗的用戶)使用,這樣就會遇到很多困難(包括如何劃分才負載均衡、處理之間怎麼調度、有機器出錯怎麼處理等),所以說作者還是比較牛的,但是作者並未在文中對這些細節進行詳細描述,都是大概說了一下思想,下面我就對這篇論文說下我的理解。

MapReduce的執行過程從名字可知,一個是Map,一個是Reduce。這其實是有點類似於歸併排序,採用分而治之的思想。Map負責把大量的數據分配給不同的主機進行計算(一般通過hash方法),Reduce把不同的主機計算的中間結果進行整理輸出。

對於使用作者說MapReduce的使用採用了函數式編程的思想,就是隻要用戶提供map和reduce這兩個方法就好了,其餘的都交給這個系統去處理。這裏作者舉了一個比較簡單的例子,統計文檔中某個單詞出現的次數:


這裏map函數對於輸入的文檔,將這個文檔中每個單詞出現的次數標記爲1,並存儲到中間的臨時文件中;reduce函數將輸入的每個單詞從所有的中間文件中統計其出現的次數,最終輸出。這樣看來使用時非常簡單的。

好了,簡單的介紹完了,下面對論文中作者說他們在設計這個系統時考慮的一些問題,首先我們來看一下這個系統總體的運行流程是什麼樣的,看下圖:


1.      MapReduce將用戶輸入的文件自動分成M份,然後將程序在集羣的不同機器上拷貝好多份進行執行;

2.      在這些執行的機器中,有一臺機器是作爲Master來運行的,其餘的叫做worker,Master負責給其它worker分配任務,一共需要分配M個map任務和R個Reduce任務;(PS:其實我看到這想到了MPI編程,這跟MPI其實類似,一般MPI是有一個接收主機,這臺機器負責將其他的機器的計算結果返回,當然MPI也可以不設定接收主機);

3.      Worker機器進行Map計算,並將中間結果存儲在buffer中;

4.      同時,緩存的結果被寫入硬盤,然後同時分配方法分到R個區域中(R的個數由用戶指定),然後將這些中間結果的“位置”傳遞給Master,Master負責將其轉發到reduce worker(確實類似MPI,進行消息傳遞);

5.      當reduce work收到消息後,它使用遠程進程讀取map緩存的數據,當reduce進程讀完之後將這些數據通過中間的關鍵字進行排序以便所有具有相同關鍵字的數據被放到一起,如果數據過大則使用外排;

6.      Reduce對於每一箇中間結果的關鍵字,訪問所有排序過的中間數據,然後將key和一致的中間的values傳遞給用戶定義的Reduce;

7.      當所有的map和reduce任務都完成了之後,master喚醒用戶程序。

當所有的都執行完畢之後,最後會有R份輸出結果。一般情況下不需要合併這R份結果,因爲很可能會用這些結果繼續進行MapReduce的操作,或者將其傳給另外的分佈式系統繼續處理。

在上述的框架下,需要處理幾個問題:

1.      master的數據結構:

maste存儲了每個map和reduce任務的狀態,中間文件的存儲位置等。

2.      容錯性

Work主機失敗:

Master每個一段時間會pingwork,如果收不到回覆,就認爲work down掉了。Completed map任務會被重新執行如果work發生錯誤,因爲中間的結果存儲在了本地的磁盤上,但是reduce work發生了錯誤則不需要重新執行已經執行過的任務,因爲reduce的結果存儲在全局的文件系統上。

Master主機失敗

Master每隔一段時間會創建一個checkpoint,如果出錯則從checkpoint重新開始就行了。

3.      位置

利用GFS文件系統,解決數據傳輸對網絡的挑戰。

4.      任務粒度

M和R要遠遠大於worker主機的數量。通過使每個主機運行不同的任務提高了負載均衡。

5.      備份

並不會等到所有的map或者reduce進行完的時候才進行下一步,有時候會遇到某一個主機速度很慢的情況(比如低速硬盤),這時可以在mapreduce操作將要完成的時候就進行下一步的操作,這樣可以大大的提高效率。 

基本上,MapReduce就是這樣的,這篇文章作者還介紹了系統中的分塊(partition),保證順序(ordering guarantee),合併(combiner)等的方法,我覺得這個思想真的是非常好,或許我們不使用mapreduce但是我們可能會處理一個有很多條記錄的數據,這樣我們就可以使用mapreduce的思想進行處理了。
發佈了28 篇原創文章 · 獲贊 19 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章