上篇文章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高级编程了。