Hadoop的MapReduce分佈式計算框架基礎教程,收藏學習

Hadoop是目前最火熱的大數據開源系統,其中包含許多組件以及衍生工具,其中許多之前都介紹過,今天來講一講大數據的核心計算框架——MapReduce。

一、簡介

所謂大數據,通常而言都需要用服務器集群來處理,普通機器處理的數據根本無法用‘大’來形容。那麼如果要實現一個大數據系統,其核心功能在於兩大部分,其一就是存儲,其二就是計算。海量數據要存儲在集群服務器上,就需要實現大型的分佈式存儲系統,在Hadoop中就是Hdfs文件管理系統。而對於海量數據的計算處理,就需要用到今天說的MapReduce計算框架了。

MapReduce,其實是兩個部分,分別是Map和Reduce,其核心思想在於分工而治。簡單來說就是先將數據分為無數個小塊,然後再分別處理每個小塊,最後將每個小塊彙總。原理圖如下:

Hadoop的MapReduce分佈式計算框架基礎教程,收藏學習

光看圖大家可能不太明白,這裡舉個簡單的例子幫助理解。假如有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函數即可:

Hadoop的MapReduce分佈式計算框架基礎教程,收藏學習

現在假設輸入文件如下:

Hadoop的MapReduce分佈式計算框架基礎教程,收藏學習

以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塊的。

運行完畢後會在指定目錄生成如下兩個文件:

Hadoop的MapReduce分佈式計算框架基礎教程,收藏學習

_SUCCESS文件表示MapReduce程序執行完畢

part-r-00000文件表示執行結果,後面數字為00000是因為只設置了一個分區,打開後結果如下:

Hadoop的MapReduce分佈式計算框架基礎教程,收藏學習

可見MapReduce將所有面值的鈔票都分別統計完畢了。

希望這篇介紹能幫助各位瞭解MapReduce運行原理,如果大家有興趣的話,還可以思考一下如何編寫MapReduce程序能夠得到最終下圖的面值總和呢?

對此有疑問大家也可以私信留言一起交流,最後別忘了關注。


分享到:


相關文章: