要說 Hadoop MapReduce 就不得不說分治算法,而分治算法其實說白了,就是四個字 分而治之 。其實就是將一個複雜的問題分解成多組相同或相似的子問題,對這些子問題再分,而後再分。直到最後的子問題能夠簡單得求解。html
要具體介紹分治算法,那就不得不說一個很經典的排序算法 -- 歸併排序。這裏不說它的具體算法代碼,只說明它的主要思想。而歸併排序的思想正是分治思想。算法
歸併排序採用遞歸的方式,每次都將一個數組分解成更小的兩個數組,再對這兩個數組進行排序,不斷遞歸下去。直到分解成最簡單形式的兩個數組的時候,再將這一個個分解後的數組進行合併。這就是歸併排序。數據庫
下面有一個取自百度百科的具體例子能夠看看:編程
咱們能夠看到,初始的數組是:{10,4,6,3,8,2,5,7}數組
第一次分解後,變成兩個數組:{10,4,6,3},{8,2,5,7}分佈式
分解到最後爲 5 個數組:{10},{4,6},{3,8},{2,5},{7}函數式編程
而後分別合併並排序,最後排序完成:{2,3,4,5,6,7,8,10}函數
上述的例子這是比較簡單的狀況,那麼咱們想一想看,當這個數組很大的時候又該怎麼辦呢?好比這個數組達到 100 GB大小,那麼在一臺機器上確定是沒法實現或是效率較爲低下的。工具
那一臺機器不行,那咱們能夠拆分到多臺機器中去嘛。恰好使用分治算法將一個任務能夠拆分紅多個小任務,而且這多個小任務間不會相互干擾,能夠獨立計算。那麼咱們能夠拆分這個數組,將這個數組拆分紅 20 個塊,每一個的大小爲 5 GB。而後將這每一個 5 GB的塊分散到各個不一樣的機器中去運行,最後再將處理的結果返回,讓中央機器再進行一次完整的排序,這樣無疑速度上會提高不少。oop
上述這個過程就是 Hadoop MapReduce 的大體原理了。
Map 和 Reduce 實際上是函數式編程中的兩個語義。Map 和循環 for 相似,只不過它有返回值。好比對一個 List 進行 Map 操做,它就會遍歷 List 中的全部元素,而後根據每一個元素處理後的結果返回一個新的值。下面這個例子就是利用 map 函數,將 List 中每一個元素從 Int 類型 轉換爲 String 類型。
val a:List[Int] = List(1,2,3,4) val b:List[String] = a.map(num => (num.toString))
而 Reduce 在函數式編程的做用則是進行數據歸約。Reduce 方法須要傳入兩個參數,而後會遞歸得對每個參數執行運算。仍是用一個例子來講明:
val list:List[Int] = List(1,2,3,4,5) //運算順序是:1-2 = -1; -1-3 = -4; -4-4 = -8; -8-5 = -13; //因此結果等於 -13 list.reduce(_ - _)
Hadoop MapReduce 和函數式中的 Map Reduce 仍是比較相似的,只是它是一種編程模型。咱們來看看 WordCount 的例子就明白了。
在這個 wordcount 程序中,Hadoop MapReduce 會對輸入先進行切分,這一步其實就是分治中分的過程。切分後不一樣部分就會讓不一樣的機器去執行 Map 操做。然後即是 Shuffle,這一階段會將不相同的單詞加到一塊兒,最後再進行 Reduce 。
這個 WordCount 程序是官方提供的一個簡易的 Demo,更復雜的任務須要本身分解成 Hadoop MapReduce 模型的代碼而後執行。
所謂 MapReduce 的意思是任何的事情只要都嚴格遵循 Map Shuffle Reduce 三個階段就好。其中Shuffle是系統本身提供的而Map和Reduce則用戶須要寫代碼。
當碰到一個任務的時候,咱們須要將它解析成 Map Reduce 的處理方式而後編寫 Hadoop MapReduce 代碼來實現。我看過一個比喻很貼切,Hadoop MapReduce 這個東西這就像是說咱們有一把大砍刀,一個錘子。世界上的萬事萬物均可以先砍幾刀再錘幾下,就能搞定。至於刀怎麼砍,錘子怎麼錘,那就算我的的手藝了。
從模型的角度來看,Hadoop MapReduce 是比較粗糙的,不管什麼方法都只能用 Map Reduce 的方式來運行,而這種方式無疑不是萬能的,不少應用場景都很難解決。而從作數據庫的角度來看,這無非也就是一個 select + groupBy() 。這也就是爲何有了後面 Spark 基於 DAG 的 RDD 概念的崛起。
這裏不得很少說一句,Hadoop 的文件系統 Hadoop Hdfs 纔是 Hadoop MapReduce 的基礎,由於 Map Reduce 最實質的支撐其實就是這個 Hadoop Hdfs 。沒有它, Map Reduce 不過是空中閣樓。你看,在 Hadoop MapReduce 式微的今天,Hadoop Hdfs 還不是活得好好的,Spark 或是 Hive 這些工具也都是以它爲基礎。不得不說,Hadoop Hdfs 才牛逼啊。
好了,接下來咱們來探究一下爲何會出現 Hadoop MapReduce 這個東西。
MapReduce 在 Google 最大的應用是作網頁的索引。你們都知道 Google 是作搜索引擎起家的,而搜索引擎的基本原理就是索引,就是爬去互聯網上的網頁,而後對創建 單詞->文檔 的索引。這樣什麼搜索關鍵字,才能找出對應網頁。這也是爲何 Google 會以 WordCount 做爲 MapReduce 的例子。
既然明白搜索引擎的原理,那應該就明白自 2000 年來互聯網爆發的年代,單臺機器確定是不夠存儲大量的索引的,因此就有了分佈式存儲,Google 內部用的叫 Gfs,Hadoop Hdfs 其實能夠說是山寨 Gfs 來的。而在 Gfs 的基礎上,Hadoop MapReduce 的出現也就天然而然了。
推薦閱讀: