Hadoop例子——運行example中的wordCount例子
一、 需求說明
單詞計數是最簡單也是最能體現MapReduce思想的程序之一,可以稱為 MapReduce版"Hello World",該程序的完整代碼可以在Hadoop安裝包的"src/examples"目錄下找到。單詞計數主要完成功能是:統計一系列文本文件中每個 單詞出現的次數,如下圖所示。
二、 環境
- VMware® Workstation 10.04
- Ubuntu14.04 32位
- Java JDK 1.6.0
- hadoop1.2.1
三、 WordCount例子的運行
1. 創建本地的示例數據文件:
依次進入【Home】-【hadoop】-【hadoop-1.2.1】創建一個文件夾file用來存儲本地原始數據。
並在這個目錄下創建2個文件分別命名為【myTest1.txt】和【myTest2.txt】或者你想要的任何文件名。
分別在這2個文件中輸入下列示例語句:
2. 在HDFS上創建輸入文件夾
呼出終端,輸入下面指令:
bin/hadoop fs -mkdir hdfsInput
執行這個命令時可能會提示類似安全的問題,如果提示了,請使用
bin/hadoop dfsadmin -safemode leave
來退出安全模式。
當分布式文件系統處於安全模式的情況下,文件系統中的內容不允許修改也不允許刪除,直到安全模式結 束。安全模式主要是為了系統啟動的時候檢查各個DataNode上數據塊的有效性,同時根據策略必要的復制或者刪除部分數據塊。運行期通過命令也可以進入 安全模式。
意思是在HDFS遠程創建一個輸入目錄,我們以后的文件需要上載到這個目錄里面才能執行。
3. 上傳本地file中文件到集群的hdfsInput目錄下
在終端依次輸入下面指令:
cd hadoop-1.2.1
bin/hadoop fs -put file/myTest*.txt hdfsInput
4. 運行例子:
在終端輸入下面指令:
bin/hadoop jar hadoop-examples-1.2.1.jar wordcount hdfsInput hdfsOutput
注意,這里的示例程序是1.2.1版本的,可能每個機器有所不一致,那么請用*通配符代替版本號
bin/hadoop jar hadoop-examples-*.jar wordcount hdfsInput hdfsOutput
應該出現下面結果:
Hadoop命令會啟動一個JVM來運行這個MapReduce程序,並自動獲得Hadoop的配置,同時把類的路徑(及其依賴關系)加入到 Hadoop的庫中。以上就是Hadoop Job的運行記錄,從這里可以看到,這個Job被賦予了一個ID號:job_201202292213_0002,而且得知輸入文件有兩個(Total input paths to process : 2),同時還可以了解map的輸入輸出記錄(record數及字節數),以及reduce輸入輸出記錄。
查看HDFS上hdfsOutput目錄內容:
在終端輸入下面指令:
bin/hadoop fs -ls hdfsOutput
從上圖中知道生成了三個文件,我們的結果在"part-r-00000"中。
使用下面指令查看結果輸出文件內容
bin/hadoop fs -cat output/part-r-00000
wordcount的例子中是以空格作為單詞的分隔符。
輸出目錄日志以及輸入目錄中的文件是永久存在的,如果不刪除的話,如果出現結果不一致,請參考這個因素。
四、 WordCount處理過程
WordCount的詳細執行步驟如下:
1)將文件拆分成splits,由於測試用的文件較小,所以每個文件為一個split,並將文件按行分割形 成<key,value>對,如圖4-1所示。這一步由MapReduce框架自動完成,其中偏移量(即key值)包括了回車所占的字符數 (Windows和Linux環境會不同)。
圖4-1 分割過程
2)將分割好的<key,value>對交給用戶定義的map方法進行處理,生成新的<key,value>對,如圖4-2所示。
圖4-2 執行map方法
3)得到map方法輸出的<key,value>對后,Mapper會將它們按照key值進行排序,並執行Combine過程,將key至相同value值累加,得到Mapper的最終輸出結果。如圖4-3所示。
圖4-3 Map端排序及Combine過程
4)Reducer先對從Mapper接收的數據進行排序,再交由用戶自定義的reduce方法進行處理,得到新的<key,value>對,並作為WordCount的輸出結果,如圖4-4所示。
圖4-4 Reduce端排序及輸出結果
文章內容圖片來自:
http://www.cnblogs.com/nod0620/archive/2012/06/20/2549395.html
http://www.cnblogs.com/xia520pi/archive/2012/05/16/2504205.html
http://www.cnblogs.com/madyina/p/3708153.html