1. 程式人生 > >Hadoop自學筆記(三)MapReduce簡單介紹

Hadoop自學筆記(三)MapReduce簡單介紹

1. MapReduce Architecture

MapReduce是一套可程式設計的框架,大部分MapReduce的工作都能夠用Pig或者Hive完畢。可是還是要了解MapReduce本身是怎樣工作的,由於這才是Hadoop的核心,而且能夠為以後優化和自己寫做準備。

 

Job Client, 就是使用者

Job TrackerTask Tracker也是一種Master - Slave構建

 

工作流程(MapReduce Pipeline

 

Job Client提交了MapReduce的程式(比方jar包中的二進位制檔案)。所須要的資料,結果輸出位置,提交給Job Tracker. Job Tracker會首先詢問Name Node, 所須要的資料都在哪些block裡面,然後就近選擇一個Task Tracker(離這些所需資料近期的一個task tracker,可能是在同一個Node上或者同一個Rack上或者不同rack),把這個任務傳送給該Task Tracker, Task Tracker

來真正執行該任務。Task Tracker內部有Task Slots來真正執行這些任務。假設執行失敗了。Task Tracker就好彙報給Job Tracker, Job Tracker就再分配給別的Task Tracker來執行。Task Tracker在執行過程中要不斷的向Job Tracker彙報。最後Task Tracker執行完畢後,彙報給Job TrackerJob Tracker就更新任務狀態為成功。

 

注意,當用戶提交一個MapReduce

任務的時候,不只同一時候把任務提交給Job Tracker,同一時候還會拷貝一份到HDFS的一個公共位置(圖中的咖啡位置),由於傳遞程式碼和命令相對要easy一些。然後Task Tracker就能夠非常方便的得到這些程式碼。

 

詳細步驟就是圖中的7步。





2. MapReduce Internals

 

Split階段:依據Input Format。把輸入資料切割成小部分,該階段與Map任務同一時候執行,切割後就放到不同的Mapper裡面。

Input Format: 決定了資料怎樣被切割放入Mapper。比方Log, 資料庫,二進位制碼,等。

Map階段:把切割後傳入的splits轉化成一些key-value對。怎樣轉化取決於使用者程式碼怎麼寫的。

Shuffle & Sort階段:把Map階段得到的資料歸類,然後送給Reducers

Reduce階段:把送入的Map資料(Key, Value)依照使用者的程式碼進行整合處理。

Output Format: Reduce階段處理完後。結果依照此格式放入HDFS的輸出資料夾。

 

Imperative Programming Paradigm: 把計算當做一系列改變程式狀態的過程。

也就是程式化程式設計。更加關注物件和狀態。

 

Functional Programming Paradigm: 大致就是函式化程式設計,把一系列計算作為一個數學函式。Hadoop使用的是這樣的程式設計正規化。

有輸入,有輸出;沒有物件沒有狀態。


 

為了優化起見,Hadoop還加入了很多其它的一個介面,combine階段,見下圖。主要是在輸送到Shuffle/sort階段前。如今本地進行一次小的Reduce計算。這樣能夠省非常多頻寬(還記得job的程式碼放入一個公共區域了嗎)


上面的整個過程看上去可能不那麼直觀,可是這是Hadoop最難理解的部分了。理解了這個流程(Hadoop Pipeline),就更easy理解以後的內容了。

 

3. MapReduce Example

 

舉樣例來說明,在實際的機器操作中Hadoop怎樣完畢上述任務。

 

Windows環境下安裝了一個hyperV軟體。裡面有四個Hadoop節點。每一個Hadoop節點都是一個Ubuntu環境。



能夠看到上面有一個Name Node,還有三個Data Node

首先,連線上Name Node。而且開啟一個Data Node節點。

進入Name NodeUbuntu系統中。開啟一個終端。輸入jps,能夠看到jvm裡面正在執行的東西。


在Data Node機器中執行相同命令,能夠看到裡面執行著DataNode, Jps, TaskTracker三個內容。

 

首先進入Data Node的機器裡面。到根資料夾以下建立一個檔案,叫words.txt,檔案內容就是上圖中要分析的一些詞。


第二步。把這個Words.txt檔案放入HDFS中。

首先

hadoop/bin/hadoop fs -ls 

檢視眼下HDFS中的檔案

然後新建一個資料夾

Hadoop/bin/hadoop fs -mkdir /data



我們能夠使用瀏覽器來看看HDFS中的檔案系統

瀏覽器中輸入hnname:50070,開啟Web UI


能夠再Live Nodes裡面看到剛剛新建的data資料夾。執行

hadoop/bin/hadoop fs -copyFromLocal words.txt /data

然後words.txt就複製到/data資料夾下了。能夠使用Web UI來驗證。

 

第三步,執行MapReduce 任務。

這個任務是統計單詞頻率,這個任務已經由現成的jar包寫好了,在hadoop/bin/資料夾下,hadoop-examples-1.2.0.jar. 這個檔案中面有非常多非常多寫好的MapReduce任務。



執行命令:

Hadoop/bin/hadoop jar hadoop/hadoop*examples.jar wordcount /data/words.txt /data/results

 

先指定jar包,再指定程式名wordcount, 再指定輸入資料/data/words.txt 最後是輸出資料夾/data/results, 沒有資料夾會建立一個。


執行完畢後。能夠通過Web UI來看執行結果。



我擦。原來的圖片太多了發不了。不得不說刪掉幾張。

。。。