Hadoop是目前最火熱的大數據開源系統,其中包含許多組件以及衍生工具,其中許多之前都介紹過,今天來講一講大數據的核心計算框架——MapReduce。
一、簡介
所謂大數據,通常而言都需要用服務器集群來處理,普通機器處理的數據根本無法用‘大’來形容。那麼如果要實現一個大數據系統,其核心功能在於兩大部分,其一就是存儲,其二就是計算。海量數據要存儲在集群服務器上,就需要實現大型的分佈式存儲系統,在Hadoop中就是Hdfs文件管理系統。而對於海量數據的計算處理,就需要用到今天說的MapReduce計算框架了。
MapReduce,其實是兩個部分,分別是Map和Reduce,其核心思想在於分工而治。簡單來說就是先將數據分為無數個小塊,然後再分別處理每個小塊,最後將每個小塊彙總。原理圖如下:
光看圖大家可能不太明白,這裡舉個簡單的例子幫助理解。假如有10000張鈔票,其中面值有1塊、5塊、10塊、20塊、50塊和100塊不等,這時需要計算出這10000張鈔票一共有多少錢,請問如何計算呢?最直接的做法就是一張一張數,然後相加,但是這樣只能由一個人來操作,因此效率是非常低下的。
比較好的做法就是先劃分6個區域,每個區域塊分別存放不同面值的鈔票,分完塊之後再計算出每堆鈔票的數量,最後彙總相加得出結果,這樣的做法最大的好處就是可以多人分工處理。而MapReduce正是採取的這種方式。
首先10000張鈔票先進入Map階段,也就是先分片。假設一共分出5個進程來處理Map階段的數據,那麼就是每個進程處理2000張鈔票,處理完畢後,每個進程都會都會得出6個區域塊。這時將這5個進程的區域塊合併,就會得出總的6個區域塊。然後進入reduce階段,reduce也會採取多進程模式,假設分出6個進程來處理reduce階段的數據。
每個進程處理一個區域塊,這時就會得到6個區域塊的結果,也就是6個面值的鈔票分別有多少,然後將其彙總,得出結果。
二、代碼
瞭解原理之後,接下來就可以看看編碼階段,其實編碼階段非常簡單,只需要實現框架提供的map和reduce函數即可:
現在假設輸入文件如下:
以1塊面值的舉例,一共有6張面值為1塊的鈔票。如果有2個map進程同時運行,那麼這兩個map進程可能運行的結果如下:
Map進程1:(1,1)(1,1)(1,1)(1,1)
Map進程2:(1,1)(1,1)
這時這兩個map進程會將結果傳入處理面值1塊的reduce進程中,最終的結果就會是:
(1,6),表示一共6張1塊的。
運行完畢後會在指定目錄生成如下兩個文件:
_SUCCESS文件表示MapReduce程序執行完畢
part-r-00000文件表示執行結果,後面數字為00000是因為只設置了一個分區,打開後結果如下:
可見MapReduce將所有面值的鈔票都分別統計完畢了。
希望這篇介紹能幫助各位瞭解MapReduce運行原理,如果大家有興趣的話,還可以思考一下如何編寫MapReduce程序能夠得到最終下圖的面值總和呢?
對此有疑問大家也可以私信留言一起交流,最後別忘了關注。
閱讀更多 程序員小鳥 的文章