這是中國大學MOOC中的大數據算法課程筆記
實際上Google已經宣佈棄用MapReduce,但是它作爲一種並行處理框架,仍然在很多地方得到了廣泛的應用。還有一個重要的MapReduce實現平臺,就是Hadoop平臺,大家仍然可以在上面使用。
這一講是從算法設計的角度來講解MapReduce。
這次分爲下面4個內容:
1、MapReduce概述
2、字數統計
3、平均數計算
4、單詞貢獻矩陣的計算
一、MapReduce概述
MapReduce是由Google公司開發的分佈式編程模型,在2004年推出。這個編程模型的目的是給一些並不熟悉並行編程的程序員提供一個編程框架,使得他們可以容易地編寫並行程序,運行在成百上千上萬的機器集羣上。
MapReduce實現了兩個主要功能
Map把一個函數應用於集合中的所有成員,然後返回一個基於這個處理的結果集。
Reduce是把從兩個或更多個Map中,通過多個線程、進程或者獨立系統對並行執行處理的結果集進行分類和歸納。
在這個過程中,用戶需要定義Map和Reduce函數
在Map過程和Reduce過程中間,需要對key/value對按key進行聚集,reduce函數被應用與每個組。
這樣每個分組都是獨立的,可以用分佈式大規模並行的方式進行處理。
上圖是MapReduce過程的示意圖。其中combine操作和partition是可選的。
partition爲並行reduce操作劃分key空間。
combine操作是map後階段運行的類reducer過程,把結果進行局部的聚集,用作減少網絡流量的優化器。
MapReduce編程的重點是,程序員需要指定相應的Map函數和Reduce函數。
執行框架處理其他的一切:
包括調度:爲map和reduce分配worker。
“數據分佈”:將過程移動到數據。
同步:中間數據進行聚集,排序或洗牌。
錯誤處理:檢測worker失敗和重新啓動。
程序員不需要知道的包括:
map和reduce在哪裏運行,mapper和reducer何時結束等細節。
本地聚合的重要性:
Mapper和Reducer的同步需要通信,而通信會對性能造成影響,因此需要儘可能的避免通信減小開銷。
所以,需要通過本地聚合減少中間數據。
二、字數統計MapReduce過程
以下是對MapReduce應用於字數統計的算法框架
“In-mapper"聚合:保持多個map調用中的狀態,將combiner的功能集成到mapper中,這樣避免了從mapper到combiner通過外存的I/O操作,這樣需要顯式的內存管理。
三、計算平均數MapReduce過程
combiner設計原則:
有時reducer可以用作combiner,但大多數情況下不行。
combiner不能改變程序的輸入輸出模型,只是起到聚合優化的作用。
下面是一個求平均數的MapReduce過程:
也可以採用In-Mapper形式:
四、單詞共現矩陣的計算
共現矩陣的定義如下:
這個算法可以作用一種測量語義距離的方法,用於許多語言處理任務。
在對輸入輸出數據的處理上用兩種方法來處理:詞對法和條紋法。
詞對法僞碼:
該方法的優點是易於實現、易懂;缺點是排序和洗牌代價高,combiner作用不大。
條紋法僞碼:
用條紋法對key-value對的排序和洗牌少得多,能更好地利用combiner;劣勢是相對更難實現,key-value對生成的對象更大。
由上述例子可以看出,我們需要對key-value數量和大小、本地聚合的形式作出權衡,使各方面的性能達到最優。
考慮的因素主要如下: