umd雲計算之MapReduce

      本文將隨着研究的深入,不斷更新。

      說起MapReduce,自然會想到從google弄到奠基性的那篇論文,英文版鏈接 以及中文版鏈接 ,不過光看論文也夠吃力,一些科普性的介紹應該首先關注關注。如孟巖的一篇MapReduce-the free lunch is not over 。還有wiki的翻譯

      我們從Jimmy Lin的角度去理解MapReduce。

      首先,說起MapReduce不得不提及Functional Programming。Jimmy Lin認爲MapReduce=functional programming meets distributed processing。首先一個概念是Higher-order Functions,即是吧其他函數作爲參數的函數。如Schema中:

         那麼這和MapReduce有什麼關係呢。首先函數式編程都是基於list的操作,那麼在函數式編程中有兩個重要的概念:

               Map: do something to everything in a list

               Fold/Reduce: combine results of a list in some way

         其中Map是一個 Higher-order Function,該操作將應用於list中的每一個元素,如下圖:

map

Map

         舉例如下:

           Fold/Reduce也是一個Higher-order Function,通過某種方式將map後新的list合併在一起,如下圖:

reduce

Fold/Reduce

              舉例如下:

 

如果我們假設有一條很長很長的list,我們希望將map操作並行化,我們希望將map操作的結果合併起來,那麼我們就引入了MapReduce。

            在umd雲計算之簡述 一文中,我們將所有計算歸結爲Divide and conquer,這一思想在MapReduce中體現的很清楚,如圖:

mapreduce

MapReduce

          現在我們進入MapReduce: Simplified Data Processing on Large Clusters這篇論文。

          首先,MapReduce runtime處理了一下幾個方面的問題:

               1. partitioning the input data

               2. scheduling

               3. handling machine failures

               4. managing inter-machine communication to handle the synchronization

          這四個問題基本涵蓋了分佈式系統基本內容。

           其次,google的MapReduce實現的基本原理如下:

implementation  

Implementation

         我們一步步的分析上圖中的步驟(摘自paper):

         1. 用戶程序中的MapReduce函數庫首先把輸入文件分成M塊,每塊大概16M到64M(可以通過參數決定)。接着在cluster的機器上執行處理程序。
         2. 這些分排的執行程序中有一個程序比較特別,它是主控程序master。剩下的執行程序都是作爲master分排工作的worker。總共有M個map任務和R個reduce任務需要分排。master選擇空閒的worker並且分配這些map任務或者reduce任務
         3. 一個分配了map任務的worker讀取並處理相關的輸入小塊。他處理輸入的數據,並且將分析出的key/value對傳遞給用戶定義的map函數。map函數產生的中間結果key/value對暫時緩衝到內存。
         4. 這些緩衝到內存的中間結果將被定時刷寫到本地硬盤,這些數據通過分區函數分成R個區。這些中間結果在本地硬盤的位置信息將被髮送回master,然後這個master負責把這些位置信息傳送給reduce的worker。
         5. 當master通知reduce的worker關於中間key/value對的位置時,他調用remote procedure來從map worker的本地硬盤上讀取緩衝的中間數據。當reduce的worker讀到了所有的中間數據,他就使用中間key進行排序,這樣可以使得相同key的值都在一起。因爲有許多不同key的map都對應相同的reduce任務,所以,排序是必須的。如果中間結果集太大了,那麼就需要使用外排序。
         6. reduce worker根據每一個唯一中間key來遍歷所有的排序後的中間數據,並且把key和相關的中間結果值集合傳遞給用戶定義的reduce函數。reduce函數的對於本reduce區塊的輸出到一個最終的輸出文件。
         7. 當所有的map任務和reduce任務都已經完成了的時候,master激活用戶程序。在這時候MapReduce返回用戶程序的調用點。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章