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來真正執行該任務。Task Tracker內部有Task Slots來真正執行這些任務。如果執行失敗了,Task Tracker就好彙報給Job Tracker, Job Tracker就再分配給別的Task Tracker來執行。Task Tracker在執行過程中要不斷的向Job Tracker彙報。最後Task Tracker執行完成後,彙報給Job Tracker,Job Tracker就更新任務狀態為成功。
注意,當使用者提交一個MapReduce任務的時候,不僅僅同時把任務提交給Job Tracker,同時還會拷貝一份到HDFS的一個公用位置(圖中的咖啡位置),因為傳遞代碼和命令相對要容易一些,然後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),就更容易理解以後的內容了。
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來看執行結果。
我擦,原來的圖片太多了發不了,不得不說刪掉幾張。。。。