1. 程式人生 > >從零開始學Hadoop——淺析MapReduce(一)

從零開始學Hadoop——淺析MapReduce(一)

      之前,我們說過Hadoop的兩個核心為HDFS和MapReduce,既然我們已經學習了Hadoop的HDFS,那麼我們就來看看MapReduce是什麼。當然,我們學習的順序還是先看看基本概念,再研究一下原理,最後做一些練習。

一、是什麼

1、概念理解

      Hadoop Map/Reduce是一個使用簡易的軟體框架,基於它寫出來的應用程式能夠執行在由上千個商用機器組成的大型叢集上,並以一種可靠容錯的方式並行處理上T級別的資料集。

2、Map(對映)

      “Map”:主結點讀入輸入資料,把它分成可以用相同方法解決的小資料塊(這裡是一個分而治之的思想),然後把這些小資料塊分發到不同的工作節點上(worder nodes)上,每一個工作節點(worder node)迴圈做同樣的事,這就行成了一個樹行結構(分散式計算中的很多模型都和圖論有關,pageRank也是),而每一個葉子節點有來處理每一個具體的小資料塊,再把這些處理結果返回給父節點。

3、Reduce(歸約)

      “Reduce”:主結節得到所有子節點的處理結果,然後把所有結果組合並且返回到輸出。

4、個人理解

      簡單的來講,map就是分,reduce就是合。怎麼理解呢?我們來看個例子。
      我們將100噸磚,從山東運到北京,如果我們用一輛能裝1噸的大卡車來運,一天跑一個來回,那麼我們需要100天,可是如果我們用10輛這樣的車來做同樣的事情,那麼我們10天就可以完成了。雖然在現實生活中,我們增加了車費等一系列支出,可能不太划算,但是對於計算機來說,我們的成本是相當低的。所以在迎接大資料的到來時,MapReduce將大大提高的計算的速度,特別方便。

二、原理解析

1、圖解細說

這裡寫圖片描述

(1).客戶端提交一個mr的jar包給JobClient(提交方式:hadoop jar ...)
(2).JobClient通過RPC和JobTracker進行通訊,返回一個存放jar包的地址(HDFS)和jobId
(3).client將jar包寫入到HDFS當中(path = hdfs上的地址 + jobId)
(4).開始提交任務(任務的描述資訊,不是jar, 包括jobid,jar存放的位置,配置資訊等等)
(5).JobTracker進行初始化任務(放入排程器)
(6).讀取HDFS上的要處理的檔案,開始計算輸入分片,每一個分片對應一個MapperTask
(7).TaskTracker通過心跳機制領取任務(任務的描述資訊)
(8).下載所需的jar,配置檔案等
(9).TaskTracker啟動一個java child子程序,用來執行具體的任務(MapperTask或ReducerTask)
(10).將結果寫入到HDFS當中

經過自己的理解後,自己又畫了一張執行圖
這裡寫圖片描述

2、詳細流程

這裡寫圖片描述

  • map任務處理
讀取輸入檔案內容,解析成key、value對。對輸入檔案的每一行,解析成key、value對。每一個鍵值對呼叫一次map函式。
寫自己的邏輯,對輸入的key、value處理,轉換成新的key、value輸出。
對輸出的key、value進行分割槽。
對不同分割槽的資料,按照key進行排序、分組。相同key的value放到一個集合中。
(可選)分組後的資料進行歸約。
  • reduce任務處理
對多個map任務的輸出,按照不同的分割槽,通過網路copy到不同的reduce節點。
對多個map任務的輸出進行合併、排序。寫reduce函式自己的邏輯,對輸入的key、value處理,轉換成新的key、value輸出。
把reduce的輸出儲存到檔案中。

總結:

      雖然之前學到的HDFS與今天的MapReduce是兩個完全不一樣的東西,但是通過今天的學習,我們知道了兩者是如何協同工作的,這樣對我們以後的實戰是非常有幫助的。下次我們將通過例項,來深層解析MapReduce的執行機制,請大家繼續關注。