Hadoop自學筆記(三)MapReduce簡單介紹
1. MapReduce Architecture
MapReduce是一套可程式設計的框架,大部分MapReduce的工作都能夠用Pig或者Hive完畢。可是還是要了解MapReduce本身是怎樣工作的,由於這才是Hadoop的核心,而且能夠為以後優化和自己寫做準備。
Job Client, 就是使用者
Job Tracker和Task 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
注意,當用戶提交一個MapReduce
詳細步驟就是圖中的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 Node的Ubuntu系統中。開啟一個終端。輸入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來看執行結果。
我擦。原來的圖片太多了發不了。不得不說刪掉幾張。
。。。