你可能已經知道:Map/Reduce是一種模式,非常適合令人煩惱的並行算法。但是什麼是令人煩惱的並行算法?答案:這個算法非常適合被多重並行的執行。那麼什麼樣的模式纔會非常適合並行算法?答案:任何作用在數據上的算法都會被隔離。
如果你編寫的程序經常會在同一個時刻執行多重事件,並且它們需要訪問一些公用數據;那麼將會出現衝突,你必須着手處理當一個事件修改某個數據時,而另一個事件正在讀取這段數據。這就是併發操作。如果你事件作用的數據段沒有被其它事件操作,那麼做的將是並行操作。顯而易見:你可以使用擴展來解決併發性問題。
舉個例子:如果你有一張記錄了城市的表格,而每個城市都有兩個屬性 —— 所屬州和城市年度平均溫度。比如:San Francisco:{CA,58}。現在你想計算每年的平均溫度 —— BY STATE。因爲可以通過state對city進行分組查詢,然後計算一個州的平均溫度而不涉及到其他的州 —— 這裏就將會出現高度並行算法問題。
如果你想逐步做這件事,你將從一個空的平均溫度表開始。然後迭代訪問表中的城市,查詢每個城市中的state屬性,接着做出相關的年度平均溫度修改。
接下來看第一幅圖:
這是一張印度地圖。有許多州:MP、CG、OR等等。同樣有數個城市,每一個城市都有{State,City average temperture}作爲值。
這裏我們將做每個周的平均溫度。我們將通過state來分組查詢城市的平均溫度,然後計算出每個組的平均值。
當然我們並不是很在意每個城市的名稱,所以將拋棄它只保留州名和城市溫度。
既然已經獲得了我們想要的數據,那麼可以通過state進行重分組。我們將得到一張關於所有州內所有平均溫度的表。
這裏我們得到了非常好的數據模型用於邏輯計算,而僅需要做的就是計算每個州的平均溫度。
當然,這並不困難。
我們有一些數據。做一點點的重分組,然後做計算。當然所有的這些都可以並行的執行(每個state一個並行任務)。
下面我們使用Map/Reduce重做這個問題!
Map/Reduce有3個步驟:Map/Shuffle/Reduce
Shuffle部分由Hadoop自行完成,這裏只需要關注Map和Reduce的實現部分。
在Map部分你需要輸入<Key,Value>數據。
在這裏Key就是城市的名稱,而Value是屬性集:所屬州以及城市均溫。
同樣通過state將temperature重分組、排除下城市名稱,那麼在state變爲Key時temperature將成爲Value。
現在Shuffle的任務是實現Map的完成。它將會通過Key進行分組,然後你就會獲得一個List<Value>。
這也將作爲Reduce任務的輸入數據 —— 從Shuffle任務中獲得的Key、List<Value>。
Reduce任務還是數據邏輯的完成者,在這裏當然就是計算州的年平均溫度。
我們也將獲得如下的最終結果
這樣就完成了Map/Reduce對數據進行重塑:
Mapper<K1,V1> ==》 <K2,V2>
Reducer<K2,List<V2> >==》<K3,V3>
簡單的Map/Reduce入門希望能幫助弄清Map/Reduce任務的實現過程,下面附帶用例代碼:用例代碼部分(Java)
原文鏈接:Confused About Map/Reduce?(編譯/仲浩 王旭東/審校)
歡迎關注@CSDN雲計算微博,瞭解更多雲信息。
本文爲CSDN編譯整理,未經允許不得轉載。如需轉載請聯繫mark