Hadoop計算框架之MapReduce

前面文章中我們已經介紹了 Hadoop 中重要的模塊 HDFS,今天我們來說說MapReduce,那麼為什麼要說 MapReduce 呢?

老規矩,我們再來說個小故事。回憶起小時候念書的時候個子比較瘦小,在學校經常受到其他大個子同學的欺負,沒辦法誰讓我打不過他呢?那怎麼辦呢,總不能老是白白的給人欺負吧,當然不,哥也不是好惹的,我一個人打不過沒關係的,我記得有一次真把我惹毛了,我就去叫了幾個玩的要好的小夥伴,合起來去揍他,最後結果就是打的他鼻青臉腫的,一次就把他治的服服帖帖的。這個小故事我只想說明一點:

人多力量大,一個人干不過他,那就多找幾個人一起。

1.MapReduce編程模型

HDFS 解決了大數據存儲的問題,那麼 MapReduce 自然要解決的是數據計算問題。前面已經說強調了一點,人多力量大啊,同樣的道理,在處理大數據計算中,一個台機器是無法滿足大批量數據計算的,那怎麼辦?輪到 MapReduce 閃亮登場了,MapReduce是一種編程模型,用於大規模數據集的並行計算,需要將數據分配到大量的機器上計算,每台機器運行一個子計算任務,最後再合併每台機器運算結果並輸出。 MapReduce 的思想就是 『分而治之』

MapReduce 將整個並行計算過程抽象到兩個函數,在 Map 中進行數據的讀取和預處理,之後將預處理的結果發送到 Reduce 中進行合併。一個簡單的 MapReduce 程序只需要指定 map()、reduce()、 input 和output,剩下的事由框架完成。

Map ( 映射 ) : 對一些獨立元素組成的列表的每一個元素進行指定的操作,可以高度並行。

Reduce( 化簡 ) : 對一個列表的元素進行合併。

2.MapReduce執行流程

以經典的 WordCount 的例子來說明一下MapReduce的執行流程,WordCount就是統計每個單詞出現的次數。

MapReduce計算框架的一般流程有以下幾個步驟:

1.輸入 ( Input ) 和拆分 ( Split ):

對數據進行分片處理。將源文件內容分片成一系列的 InputSplit,每個 InputSplit 存儲著對應分片的數據信息,記住是對文件內容進行分片,並不是將源文件拆分成多個小文件。

2.迭代 ( iteration ):

遍歷輸入數據,並將之解析成 key/value 對。拆分數據片經過格式化成鍵值對的格式,其中 key 為偏移量,value 是每一行的內容,這一步由MapReduce框架自動完成。

3.映射 ( Map ):

將輸入 key/value 對映射 ( map ) 成另外一些 key/value 對。MapReduce 開始在機器上執行 map 程序,map 程序的具體實現由我們自己定義,對輸入的 key/value 進行處理,輸出新的 key/value,這也是hadoop 並行事實發揮作用的地方。

4.洗牌 ( Shuffle ) 過程:

依據 key 對中間數據進行分組 ( grouping )。這是一個洗牌的過程,得到map方法輸出的 <key,value> 對後,Mapper 會將它們按照 key 值進行處理,這包括 sort (排序)、combiner (合併)、partition (分片) 等操作達到排序分組和均衡分配,得到 Mapper 的最終輸出結果交給 Reducer。mapper 和 reducer 一般不在一個節點上,這就導致了reducer 需要從不同的節點上下載數據,經過處理後才能交給 reducer 處理。

5.歸併( Reduce ):

以組為單位對數據進行歸約 ( reduce )。Reducer 先對從 Mapper 接收的數據進行排序,再交由用戶自定義的 reduce方法進行處理。

6.迭代:

將最終產生的 key/value 對保存到輸出文件中。得到新的 <key,value> 對,保存到輸出文件中,即保存在 HDFS 中。

3.數據本地化

前面的文章中我已經介紹了 Hadoop 的核心就是存儲( HDFS )和計算( MapReduce )。HDFS 提供了對海量數據的存儲支持,MapReduce提供了對海量數據計算處理。

上篇 HDFS 的文章中已經介紹了 NameNode(文件系統),DataNode(數據節點)。MapReduce 計算框架中負責計算任務調度的 JobTracker 對應 HDFS 的 NameNode 的角色,只不過一個負責計算任務調度,一個負責存儲任務調度。MapReduce 計算框架中負責真正計算任務的 TaskTracker 對應到 HDFS 的 DataNode 的角色,一個負責計算,一個負責管理存儲數據。

考慮到數據本地化的原則,一般將 JobTracker 和 NameNode 部署在一台機器上,而將 TaskTracker 和對應的 DataNode 部署在一個機器上。為什麼要這樣分配呢?都說近水樓台先得月,你數據跟我計算任務挨得近,我不是輕而易舉的就給你處理了,省去了不同機器之間數據傳輸的消耗,這就是所謂的 "運算移動,數據不移動"。

下一篇將深入 MapReduce 工作原理,Shuffle 過程等,敬請期待。

如果覺得文章不錯,歡迎轉發點贊,另外有錯誤歡迎留言指出,謝謝。

歡迎關注我的公眾號:Jianpan

更多好文,敬請期待!


推薦閱讀:

大數據與數據脫敏
觀數科技李科:解決Hadoop應用防護問題,潛在市場規模百億級 | 愛分析訪談
《Machine Learning:Clustering &amp; Retrieval》課程第3章KMeans之並行化
Azkaban任務流編寫
Hadoop平台上的超高性能OLAP解決方案—來自天善智能大數據沙龍【上海站】Kyligence解決方案架構師馮禮

TAG:Hadoop | 分散式系統 | MapReduce |