十張圖帶你入門Map/Reduce


發表於2013-01-07 14:166647次閱讀| 來源個人博客10 條評論| 作者Aurelien
摘要:博主Aurelien,從13歲開始編程。曾在荷蘭、比利時、法國、硅谷等多個國家從事網站開發,現效力於Terracotta公司。本篇文章來自Aurelien博客,用一個很簡單的用例爲初學者介紹了Map/Reduce的使用方法;希望爲廣大初學者帶來幫助。

你可能已經知道: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

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