寫在文章之前。。。。。。
寫文章一方面是爲了記錄在學習和實踐的過程中遇到的問題以及對應的解決方法,二是回顧梳理知識,加深理解。初學Hadoop,對其中的很多的設計原理和思想還不甚理解,因此文章中對於Hadoop的知識點表述不正確的地方,還望大神能夠予以指正。
===================================華麗的分割線======================================
本文的目的是使用Eclipse搭建Hadoop開發環境
環境說明與準備:
一個已經搭建好的Hadoop集羣
32位 Windows 7
jdk 1.7
Eclipse 4.3
hadoop-2.5.2(Windows 7下使用)
hadoop-eclipse-plugin-2.6.0
包含插件hadoop-eclipse-plugin-2.6.0.jar和32位和64位的winutils.exe和hadoop.dll的壓縮包的下載地址:http://down.51cto.com/data/2010240
第一步:配置Hadoop環境變量,與jdk環境變量的配置基本類似
把下載的hadoop-2.5.2解壓到D盤的根目錄下,然後計算機==》屬性==》高級系統設置==》環境變量
HADOOP_HOME:D:\hadoop-2.5.2
編輯PATH變量,添加:;%HADOOP_HOME%\bin。
第二步:安裝Eclipse插件
把hadoop-eclipse-plugin-2.6.0.jar放到eclipse==》plugins目錄下面,重啓Eclipse,打開Window==》Preferences,能夠看到Hadoop Map/Reduce就是插件安裝成功,下面指定Hadoop的安裝目錄即第一步設定的HADOOP_HOME。
第三步:新建Map/Reduce Project工程
輸入工程名稱,然後點擊Finish按鈕
可以看到如下圖所示,可以看到有新建的工程還有自動生成的DFS Locations,此時點擊DFS Locations什麼都不會看到,因爲還沒有配置其相應的HDFS:
第四步:顯示Hadoop的Map/Reduce Locations視圖,配置Hadoop Locations
Window==》Show View==》Other,找到Map/Reduce Tools下的Map/Reduce Locations,並點擊ok。
可以在下面看到Map/Reduce Locations,並New Hadoop Locations
設置下面幾個參數:
Location name:起一個名字,這裏是hadoopLocation;
---------------我對hadoop的配置文件還沒完全理解,下面是引用自別人的鏈接------------
Map/Reduce Master 部分相關定義:
Host:JobTracker所在的機器的IP地址
port:JobTracker的端口
兩個參數就是 mapred-site.xml中mapred.job.tracker的ip和端口
DFS Master部分:
Host:就是上一節集羣搭建中Namenode所在機器IP
Port:就是namenode的端口
這兩個參數是在 core-site.xml裏fs.default.name裏面的ip和端口
---------------------------------------------------------------------------------
下面根據我測試的結果,說說我的理解,不一定對。
端口號一定要與自己的hadoop集羣的配置文件一致
Map/Reduce(V2) Master
Host:hadoop集羣中的任何一個節點都是可以的,用來做Map/Reduce計算用的;我這裏hadoop集羣中有4臺機器,我在這個配置中,寫任何一個節點程序都是可以正常運行的,所以我認爲這個可以是hadoop集羣中的任何一個節點就可以。但是不建議使用master節點,因爲master節點壓力過大的話,master一旦掛掉,整個集羣都down了,所以不要給master計算的壓力。
Port:該節點的對應的JobTracker的端口
DFS Master
Host:只能是hadoop集羣的Master節點,即定義在core-site.xml中的fs.default.name中的value來體現的,例如hdfs://192.168.3.57:8020;這裏host就是192.168.3.57,隊友的port就是8020
Port:上面已做說明
關於User Name的問題,在這裏補充說明一下,因爲我的Windows賬戶就是lxy-PC,所以這裏它會使用這個名稱(lxy)去鏈接hadoop集羣,修改上面的User name好像是不起作用的,而我的hadoop集羣中剛好有lxy這個賬戶,所以我開始沒有發現問題。如果hadoop集羣中,沒有lxy賬戶的話,好像不能對HDFS進行編輯和操作,只能查看,針對這個問題有兩個解決方案:一是修改Windows的賬戶名稱;二是在集羣下面新建一個與Windows賬戶名稱對應的賬戶。
如果上面配置都正確的話,此時可以打開Project Explorer中的DFS Locations,可以查看hdfs中的文件,並對文件進行增加,刪除操作。
第五步:編寫Map/Reduce程序,測試運行。這裏使用hadoop自帶的例子WordCount進行測試,直接把代碼放到WordCount工程中的src目錄下,設置運行參數,Run As==》Run Configuration,設置Arguments, 因爲WordCount需要兩個參數,一個是統計哪個目錄下的文件中出現的詞,一個是統計結果存放的地方
此時運行程序,你將看到如下運行結果:
log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. Exception in thread "main" java.lang.NullPointerException at java.lang.ProcessBuilder.start(ProcessBuilder.java:1010) at org.apache.hadoop.util.Shell.runCommand(Shell.java:482) at org.apache.hadoop.util.Shell.run(Shell.java:455) at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:702) at org.apache.hadoop.util.Shell.execCommand(Shell.java:791) at org.apache.hadoop.util.Shell.execCommand(Shell.java:774) at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:646) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:434) at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:281) at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:125) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:348) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1285) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1282) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1614) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1282) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1303) at WordCount.main(WordCount.java:70)
上面的提示信息是log4j沒有配置導致的。但是出現上面的錯誤,是因爲在Windows下運行Map/Reduce程序需要winutils.exe和hadoop.dll的支持,這兩個文件在我上面給出來的下載鏈接裏面都有,需要根據系統位數的不同,選擇32位或者64位的,然後拷貝上面兩個文件放到HADOOP_HOME/bin目錄下,然後拷貝hadoop.dll到C:\Windows\System32目錄下,做完上面的工作時候,再次運行WordCount。還是會看到log4j的提示信息,但是沒有關係,此時可以查看統計結果。
$ hadoop fs -cat output/* Goodbye 1 Hadoop 1 This 1 file 2 goodbye 1 hadoop 4 hello 1 is 2 test 2 this 1
下面把我的測試的輸入文件給貼出來:
test.txt
this is hadoop test file This is hadoop test file Goodbye Hadoop goodbye hadoop
testHadoop.txt
hello hadoop
可以結合測試文件,與統計結果做比較,說明已經可以成功的在Eclipse下運行Hadoop程序。