?
這是Hadoop學習全程記錄第2篇,在這篇里我將介紹一下如何在Eclipse下寫第一個MapReduce程序。?
新說明一下我的開發環境:?
操作系統:在windows下使用wubi安裝了ubuntu 10.10?
hadoop版本:hadoop-0.20.2.tar.gz?
Eclipse版本:eclipse-jee-helios-SR1-linux-gtk.tar.gz?
為了學習方便這個例子在“偽分布式模式”Hadoop安裝方式下開發。?
第一步,我們先啟動Hadoop守護進程。?
如果你讀過我第1篇文章Hadoop學習全程記錄——hadoop 入門應該比較清楚在“偽分布式模式”下啟動Hadoop守護進程的方法,在這里就不多說了。?
第二步,在Eclipse下安裝hadoop-plugin。?
1.復制 hadoop安裝目錄/contrib/eclipse-plugin/hadoop-0.20.2-eclipse-plugin.jar 到 eclipse安裝目錄/plugins/ 下。?
2.重啟eclipse,配置hadoop installation directory。?
如果安裝插件成功,打開Window-->Preferens,你會發現Hadoop Map/Reduce選項,在這個選項里你需要配置Hadoop installation directory。配置完成后退出。?
3.配置Map/Reduce Locations。?
在Window-->Show View中打開Map/Reduce Locations。?
在Map/Reduce Locations中新建一個Hadoop Location。在這個View中,右鍵-->New Hadoop Location。在彈出的對話框中你需要配置Location name,如myubuntu,還有Map/Reduce Master和DFS Master。這里面的Host、Port分別為你在mapred-site.xml、core-site.xml中配置的地址及端口。如:?
Map/Reduce Master?
- localhost??
- 9001??
DFS Master?
- localhost??
- 9000??

配置完后退出。點擊DFS Locations-->myubuntu如果能顯示文件夾(2)說明配置正確,如果顯示"拒絕連接",請檢查你的配置。?

第三步,新建項目。?
File-->New-->Other-->Map/Reduce Project?
項目名可以隨便取,如hadoop-test。?
復制 hadoop安裝目錄/src/example/org/apache/hadoop/example/WordCount.java到剛才新建的項目下面。?
第四步,上傳模擬數據文件夾。?
為了運行程序,我們需要一個輸入的文件夾,和輸出的文件夾。輸出文件夾,在程序運行完成后會自動生成。我們需要給程序一個輸入文件夾。?
1.在當前目錄(如hadoop安裝目錄)下新建文件夾input,并在文件夾下新建兩個文件file01、file02,這兩個文件內容分別如下:?
file01?
- Hello?World?Bye?World???
file02?
- Hello?Hadoop?Goodbye?Hadoop??
2.將文件夾input上傳到分布式文件系統中。?
在已經啟動Hadoop守護進程終端中cd 到hadoop安裝目錄,運行下面命令:?
- bin/hadoop?fs?-put?input?input01??
這個命令將input文件夾上傳到了hadoop文件系統了,在該系統下就多了一個input01文件夾,你可以使用下面命令查看:?
- bin/hadoop?fs?-ls??
第五步,運行項目。?
1.在新建的項目hadoop-test,點擊WordCount.java,右鍵-->Run As-->Run Configurations?
2.在彈出的Run Configurations對話框中,點Java Application,右鍵-->New,這時會新建一個application名為WordCount?
3.配置運行參數,點Arguments,在Program arguments中輸入“你要傳給程序的輸入文件夾和你要求程序將計算結果保存的文件夾”,如:?
- hdfs://localhost:9000/user/panhuizhi/input01?hdfs://localhost:9000/user/panhuizhi/output01??
這里面的input01就是你剛傳上去文件夾。文件夾地址你可以根據自己具體情況填寫。?
?
?
?
?
?
?
4.點擊Run,運行程序。?
點擊Run,運行程序,過段時間將運行完成,等運行結束后,可以在終端中用命令:?
- bin/hadoop?fs?-ls??
查看是否生成文件夾output01。?
用下面命令查看生成的文件內容:?
- bin/hadoop?fs?-cat?output01/*??
如果顯示如下,恭喜你一切順利,你已經成功在eclipse下運行第一個MapReduce程序了。?
- Bye?1??
- Goodbye?1??
- Hadoop??2??
- Hello???2??
- World???2??
?
?
?
可能遇到的問題
1、如果遇到這個錯誤:org.apache.hadoop.security.AccessControlException: Permission denied: user=administrator, access=EXECUTE, inode="job_201111031322_0003":heipark:supergroup:rwx-
問題原因:本地用戶administrator(本機windows用戶)想要遠程操作hadoop系統,沒有權限引起的。
解決辦法:
a、如果是測試環境,可以取消hadoop hdfs的用戶權限檢查。打開conf/hdfs-site.xml,找到dfs.permissions屬性修改為false(默認為true)OK了。
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
b、修改hadoop location參數,在advanced parameter選項卡中,找到hadoop.job.ugi項,將此項改為啟動hadoop的用戶名即可。
注意第一次設置的時候可能沒有hadoop.job.ugi參數,報錯后在去看就有了。
2、運行例子時出現:IOException: Cannot run program "chmod": CreateProcess error=2,
問題原因:沒有安裝cygwin 或 沒有配置環境變量;
???????解決辦法:安裝并配置環境變量 bin到 path下 重啟 eclipse? ?問題解決;
3、如果出現下面問題
11/11/03 12:21:31 WARN mapred.LocalJobRunner: job_local_0001
???????????? java.lang.OutOfMemoryError: Java heap space
????????????? at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:781)
???????????? ?at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:350)
???????????? ?at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307)
????????????? at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:177)
???????????? 11/11/03 12:21:31 INFO mapred.JobClient:? map 0% reduce 0%
???????????? 11/11/03 12:21:31 INFO mapred.JobClient: Job?complete: job_local_0001
???????????? 11/11/03 12:21:31 INFO mapred.JobClient: Counters: 0
???????????? Exception in thread "main" java.io.IOException: Job failed!
????????????? at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1252)
????????????? at mapred.WordCount.main(WordCount.java:110)
問題原因:客戶端程序運行時java虛擬機內存分配不夠
解決辦法:修改run configuration,選擇Arguments選項卡,在VM arguments欄中加入-Xmx1024m,保存即可解決問題。
?