1. 程式人生 > 實用技巧 >大資料快速入門(05):MapReduce 程式設計模型賞析

大資料快速入門(05):MapReduce 程式設計模型賞析

一、Hadoop 誕生的**故事

在這裡插入圖片描述
(上圖是 Doug Cutting,hadoop 之父)

1985年,Cutting 畢業於美國斯坦福大學。

Cutting 的第一份工作是在 Xerox 做實習生,為鐳射掃描器上的作業系統開發螢幕保護程式,這也是他最早的“平臺”級的作品。

Cutting 卻不滿足於此,於是他開始踏入搜尋領域,讓搜尋技術可以為更多人所用。於是1997年底,他用 java 開發出了 Lucene,一個非常偉大的專案。

2004年,Cutting 和同為程式設計師出身的 Mike Cafarella 決定開發一款可以代替當時的主流搜尋產品的開源搜尋引擎,這個專案被命名為 Nutch。

剛好 2004 年 Google 釋出了大資料分析、MapReduce 演算法的論文,於是 Doug Cutting 利用 Google 公開的技術,擴充他已經開發出來的 Lucene 搜尋技術,進而打造出了 Hadoop。

二、MapReduce 程式設計模型

其實在 Hadoop 誕生之前,其實就已經有了分散式計算,只是那個時候的分散式計算都是專用的系統,只能專門處理某一類計算問題,比如大規模資料的排序,有很多的侷限性。

而 Hadoop 的出現,使大資料計算通用程式設計成為可能,我們只需要遵循 MapReduce 程式設計模型編寫業務處理程式碼,就可以執行在 hadoop 叢集上,無需關係分散式計算內部是如何處理的。

但其實 MapReduce 程式設計模型並不是 Hadoop 原創,甚至也不是 Google 原創,但是 Google 和 Hadoop 創造性地將 MapReduce 程式設計模型用到大資料計算上,立刻產生了神奇的效果。

看似複雜的各種各樣的機器學習、資料探勘、SQL 處理等大資料計算變得簡單清晰起來。

MapReduce 是一種非常簡單的模型。

簡單在於其程式設計模型只包含 Map 和 Reduce 兩個過程,map 的主要輸入是一對 <Key, Value> 值,經過 map 計算後輸出一對 <Key, Value> 值;

然後將相同 Key 合併,形成 <Key, Value 集合 >;

再將這個 <Key, Value 集合 > 輸入 reduce,經過計算輸出零個或多個 <Key, Value> 對。

MapReduce 又是一份非常強大的模型

不管是關係代數運算(SQL 計算),還是矩陣運算(圖計算),大資料領域幾乎所有的計算需求都可以通過 MapReduce 程式設計來實現。

三、Hadoop 的 MapReduce 設計目標是什麼

hadoop 的 MapReduce 大部分借鑑了 Google 的 MapReduce 的設計思想,包括簡化程式設計介面,提高系統容錯性等等。總結一下 MapReduce 的設計目標,主要有四個:

  • 易於程式設計
    傳統的分散式程式設計非常複雜,使用者需要關注的細節非常多,比如資料分片、資料傳輸、節點間通訊等,因而設計分散式程式的門檻非常高。
    MapReduce的一個重要設計目標便是簡化分散式程式設計。它將與並行程式邏輯無關的設計細節抽象成公共模組並交由系統實現,而使用者只需專注於自己的應用程式邏輯實現,這樣簡化了分散式程式設計且提高了開發效率。

  • 良好的擴充套件性
    隨著業務的發展,積累的資料量(如搜尋公司的網頁量)會越來越大,當資料量增加到一定程度後,現有叢集可能已經無法滿足其計算和儲存需求,這時候管理員可能期望通過新增機器以達到線性擴充套件叢集能力的目的。

  • 高容錯性
    在分散式環境下,隨著叢集規模的增加,叢集中的故障次數(這裡的“故障”包括磁碟損壞、機器宕機、節點間通訊失敗等硬體故障和使用者程式bug產生的軟體故障)會顯著增加,進而導致任務失敗和資料丟失的可能性增加,為避免這些問題,MapReduce通過計算遷移或者資料遷移等策略提高叢集的可用性與容錯性。

  • 高吞吐率
    一個分散式系統通常需要在高吞吐率和低延遲之間做權衡,而MapReduce計算引擎則選擇了高吞吐率。MapReduce通過分散式並行技術,能夠利用多機資源,一次讀取和寫入海量資料。

四、核心設計思想是什麼

MapReduce模型是對大量分散式處理問題的總結和抽象,它的核心思想是分而治之,即將一個分散式計算過程拆解成兩個階段:

第一階段:Map階段,由多個可並行執行的Map Task構成,主要功能是,將待處理資料集按照資料量大小切分成等大的資料分片,每個分片交由一個任務處理。

第二階段:Reduce階段,由多個可並行執行的Reduce Task構成,主要功能是,對前一階段中各任務產生的結果進行規約,得到最終結果。

以一個 wordcount 詞頻統計來說明
在這裡插入圖片描述
map 函式的計算過程是,將這行文字中的單詞提取出來,針對每個單詞輸出一個 <word, 1> 這樣的 <Key, Value> 對。

reduce 函式的計算過程是,將這個集合裡的 1 求和,再將單詞(word)和這個和(sum)組成一個 <Key, Value>,也就是 <word, sum> 輸出。每一個輸出就是一個單詞和它的詞頻統計總和。

五、總結

今天介紹了 MapReduce 程式設計模型,它是一個非常簡單而又強大的模型。

簡單之處在於它只有兩個方法

強大之處在於它幾乎可以處理大資料領域所有的計算需求。

更多精彩關注公眾號:KK架構師