本文實踐源代碼的碼雲地址: https://gitee.com/MaxBill/HMRPhtml
在上文《hadoop(05)、使用Eclipse鏈接遠程Hadoop集羣》中咱們主要實踐了使用Eclispe開發工具安java
裝hadoop的開發插件,而且使用hadoop插件鏈接Hadoop遠程集羣。本文咱們要在上文搭建的hadoop開node
發環境的基礎上開發Hadoop的MapReduce項目。git
1.hadoop集羣web
2.安裝了hadoop插件的Eclipseapache
建立MapReduce項目能夠經過eclispe的MapReduce插件建立,也可使用Maven來構建,建議使用Maven來構建,能夠更好的管理項目依賴等問題,下面兩種方式都會進行:api
1.打開Eclipse的File菜單下的New Project視圖,選擇創建Map/Reduce Projecteclipse
2.新建一個Map/Reduce項目函數
配置默認的hadoop,點擊Configure Hadoop install directory...工具
設置完成默認的hadoop,點擊next
配置項目信息,點擊完成,便可建立一個新的Map/Reduce項目
注意:以上方式適合簡單的Map/Reduce項目,須要手動管理項目的JAR包,建議使用Maven來構建Map/Reduce項目,文本實際上使用的是如下Maven的方式:
1.建立Maven項目
點擊File菜單下的New Project視圖,選擇創建Maven Project
2. 填寫項目信息,完成便可
項目結構以下:
注:代碼中項目名重構爲HMRP了
1.在上面建立的Maven項目中添加用到的hadoop開api包依賴
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.8.2</version>
</dependency>
pom.xml以下圖:
項目總體結構圖以下:
注意:項目個類說明
JobBean:是用來傳遞做業運行所需參數的BEAN
WordCountMap:咱們本身定義的map函數類
WordCountReduce:咱們定義的reduce函數類
HdfsUtils:Hdfs操做的工具類
JobsUtils:做業工具類
WordCount:詞頻統計主類
項目源代碼已經上傳碼雲,地址:https://gitee.com/MaxBill/HMRP
2.建立WordCount類,使用hadoop官方給出的例子代碼來調試
本文使用的hadoop的版本是2.8.2,使用《官方hadoop2.8.2的wordcount示例代碼》實踐
3.使用java操做HDFS
咱們對官方的例子作一些改動,官方是將寫好的WordCount程序丟到hadoop上去執行,咱們採用eclipse遠程開發調試的方式
<1>.編寫java客戶端操做遠程hdfs的工做類
<2>.編寫自定義map函數
<3>.編寫自定義reduce函數
<4>.編寫做業工具類
4.咱們改動後的測試主類
1.準備資源數據
咱們是統計詞頻程序,準備一個文本的元數據,用於咱們的統計詞頻做業程序,在本地建一個txt文本,裏面內容隨便輸入一些單詞和句子便可
2.啓動hadoop集羣
3.運行程序查看狀態
從hdfs的web控制面板或者eclipse的hdfs插件能夠看到,在數據輸出目錄已經產生執行完做業的數據結果了 :
4.查看做業執行數據結果集
在eclipse的插件中雙擊咱們執行做業產生的做業結果:
和輸入的元數據進行比對,統計結果正確
1.用戶權限問題
Permission denied: user=hadoop, access=WRITE, inode="/":root:supergroup:drwxr-xr-x
解決方案:執行 hadoop fs -chmod 777 /user/hadoop,其餘的操做目錄也要賦權限
2.集羣格式問題
在使用hdfs namenode -format格式化namenode的時候必定要先刪除各個節點下data目錄下的舊數據,否則會啓動集羣后沒法鏈接datanode
本文應用對官方WordCount的例子進行改動,實踐了使用Eclispe鏈接遠程Hadoop集羣操做Hdfs以及開發運行調試了一個簡單的MapReduce的項目。在項目中遇到了許多問題在文中也都列了出來,經過查資料也都順利解決了。文中介紹了兩種建立MapReduce項目的方式,實際項目中通常都會採用Maven的方式來構建,雖然完整的實踐了MapReduce項目的開發過程,可是MapReduce和Hdfs是什麼關 系,MapReduce運行的原理是什麼,在後面的文中咱們詳細的討論。