上篇文章http://www.cnblogs.com/ljy2013/articles/4417933.html 講到我的hadoop集群是在linux上已經搭建好了,我想在windows下,通過eclipse來創建我的hadoop的項目,並調試和執行。這篇文章終於讓我夢想成真了。其中也遇到了很多問題,下面將具體過程跟大將講一下:
首先,當然是經過上篇文章http://www.cnblogs.com/ljy2013/articles/4417933.html我們已經可以在eclipse中有了hadoop的插件了,下面我們要做的就是能在這個環境上面跑一下我的hadoop的程序,實際上就是測試階段我的開發環境是否可用。我們很容易想到的就是用hadoop源碼自帶的WordCount的例子。
有了上面的想法,那么好的,我們就趕緊動手來實現把。
1、在eclipse中創建Mapreduce工程
啟動eclipse,打開File --->new ---->project 如下圖所示:

選擇Map/Reduce,輸入自定義的工程名Project name。點擊finished即可。第一次創建對應的集群的hadoop中的hdfs會被加載到eclipse當中的。如下圖所示:

2、在上面的工程下創建相應的類,這個類就是WordCount類名,並將hadoop的原發復制進去即可
3、運行。本以為可以運行成功,但是現實總是非常殘酷的,又遇到問題了,並且問題很多。下面一一的介紹 (這些問題都可以通過查看eclipse工程目錄下的E:\code\eclipse\workspace\wordcount下日志文件Import.log查看具體的錯誤。 )
問題1:log4j的警告
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
出現這個問題的原因是eclipse無法輸出日志。
解決的辦法:可以在工程目錄的src下面添加log4j.properties文件,並且在該文件中添加:
log4j.rootLogger=INFO, Import log4j.appender.Import=org.apache.log4j.RollingFileAppender log4j.appender.Import.File=Import.log log4j.appender.Import.MaxFileSize=1000000KB log4j.appender.Import.MaxBackupIndex=9 log4j.appender.Import.layout=org.apache.log4j.PatternLayout log4j.appender.Import.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss SSS} [%c]-[%p] %m%n
並且在主函數中添加加載該文件的代碼:
String rootPath = System.getProperty("user.dir" );
PropertyConfigurator.configure(rootPath+"\\log4j.properties");
此時,問題解決。
問題2:java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
注意前面的NULL,奇怪,為什么為NULL呢?跟代碼就去發現是HADOOP_HOME的問題。如果HADOOP_HOME為空,必然fullExeName為null\bin\winutils.exe。
解決的辦法:配置HADOOP_HOME的環境變量。重啟電腦,問題解決。
問題3:Could not locate executable D:\Hadoop\tar\hadoop-2.2.0\hadoop-2.2.0\bin\winutils.exe in the Hadoop binaries.
問題的原因是因為在D:\Hadoop\tar\hadoop-2.2.0\hadoop-2.2.0\bin目錄下沒有winutils.exe文件,當然會報錯。
解決辦法:從這個地方 https://github.com/srccodes/hadoop-common-2.2.0-bin 下載一個hadoop-common-2.2.0-bin-master.zip文件,里面有winutils.exe文件,將其放進去即可。
問題4:Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
本以為問題解決了,但是有出現了問題,到這我已經崩潰了。但是通過網上查找,還是有人跟我一樣的問題的。
問題的原因是:缺少dll文件,還記得問題3中從https://github.com/srccodes/hadoop-common-2.2.0-bin下載的東西吧,里面就有hadoop.dll。
解決辦法:就是用hadoop-common-2.2.0-bin-master/bin目錄替換本地hadoop的bin目錄,並在環境變量里配置PATH=HADOOP_HOME/bin,重啟電腦。
問題5:Permission denied: user=administrator, access=WRITE,inode="grid":grid:supergroup:rwxr-xr-x”
這個時候我以為執行成功。但是又出問題了,這個時候我想跳樓的心情都有,但是還是冷靜的告訴自己,成大事者,要能沉得住氣,切忌心浮氣躁。於是google了一下錯誤,令人欣慰的是有跟我一樣的錯誤。果斷進入。很快知道問題的原因了。
原因:由於我是windows用戶,所以提示用戶為“administrator” ,后面的問題是用grid登錄到hadoop的hdfs中,由於需要創建文件夾
此時不得不感嘆,不容易啊!終於搞定了。接下來就可以愉快的玩轉hadoop的MapRedeuce高級編程了。
