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 & Retrieval》課程第3章KMeans之並行化
※Azkaban任務流編寫
※Hadoop平台上的超高性能OLAP解決方案—來自天善智能大數據沙龍【上海站】Kyligence解決方案架構師馮禮