前提:你搭建好了hadoop 2.x的linux环境,并能够成功运行。还有就是window能够访问到集群。over
1、
hfds-site.xml 增加属性:关闭集群的权限校验,windows的用户一般与linux的不一样,直接将它关闭掉好了。记住不是core-site.xml 重启集群
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
2、hadoop-eclipse-plugin-2.7.0.jar将插件放到plugins目录下
3、复制linux master已安装好的hadoop目录到windows,然后eclipse 配置定位hadoop的目录,重启eclipse
4、打开配置,hadoop选项,定位hadoop主目录。然后打开mapreduce的view 设置配置属性:其他额外属性不要配置,用户名也不用改,此时可以链接上了。
5、新建MR工程
6、建立wordcount类(自己复制就行)
在src下面直接新建log4j.properties:
内容如下:主要是打印信息:(你可以将info改成debug,内容过多,改成info了)
log4j.rootLogger=info,stdout,R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=mapreduce_test.log
log4j.appender.R.MaxFileSize=1MB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
log4j.logger.com.codefutures=DEBUG
7、错误多多啊:
运行报:
1)、java.io.IOException: HADOOP_HOME or hadoop.home.dir are not set.
2)java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
解决方式1)人家提示HADOOP_HOME没有设置,那就配置windows的环境变量,定位到hadoop目录
运行报:
第一项不报了,第二项继续:
2)java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
说不能定位,看来是HADOOP_HOME没起作用,那就在main里添加代码,否则不报null:
System.setProperty("hadoop.home.dir" , "E:\\bigdata\\hadoop2" );
运行报:
Could not locate executable E:\bigdata\hadoop2\bin\winutils.exe in the Hadoop binaries.
这次变了,检查目录,的确没有winutils.exe,因为我们是从linux复制下来的
那就增加呗:
从https://github.com/srccodes/hadoop-common-2.2.0-bin 下载bin目录,替换到windows中hadoop里的bin目录
运行报:
第二项不报了,又来新的了:
Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException :
Input path does not exist: file:/input
这个嘛,嘿嘿,参数设置成绝对的,hadoop1的时候不用,现在是第二代:
乖乖的设置参数为 hdfs://master:9000/input hdfs://master:9000/output
运行 继续报错:
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
说是本地库的问题,那就改改源码,将本地库的调用屏蔽掉:
拷贝源码文件org.apache.hadoop.io.nativeio.NativeIO到项目中 ,定位: 然后定位到570行(别hadoop2.2是,版本不一样现在2.7是607行还是直接搜索public static boolean access(String path,
AccessRight desiredAccess)吧,),直接修改为return
true; 不让access了。
复制麻烦,那就新建类,定位包,然后复制类内容就行了。
继续运行继续报错:
org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator,
access=WRITE, inode="/output/_temporary/0":root:supergroup:drwxr-xr-x
权限不够,linux用户是root,window默认用户是Administrator 我都将window改成root了,看来这个改法没起作用。另外我在core-site.xml也增加了不让校验权限啊,不管用。重新设置参数:换一种方式,之前是在core-site.xml设置的权限为false,改到hdfs-site.xml里试试,如果不行改源码。(所以我在第一步提示是在hdfs里而不是core里面改)
运行 继续报,别报了,出结果了:
Input split bytes=100
Combine input records=179
Combine output records=131
Reduce input groups=131
Reduce shuffle bytes=1836
Reduce input records=131
Reduce output records=131
对于: WARN - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable这个警告没事,运行在linux就不报了。
8、最后,尝试将wordcount拆成子类的形式,将mapper移出来试试,因为有的时候多个类会提示报错:
删除output目录,重新运行:OK,没问题,正确出结果了。
9、欢迎访问下hegou.me这个网站。怎么样,只是在本机搭建个测试环境。工作中就不要在正式集群里跑了。还是乖乖测试好代码先。over。