在虚拟机中搭建了一个伪分布式的hadoop环境,基于ubuntu13.04,可以在命令行中通过hadoop jar运行自带wordcount。另外,主机运行的是win7+eclipse4.3,已将hadoop的源码导入eclipse,并且eclipse的hadoop插件也已经编译安装好了,但是在主机的eclipse中run on hadoop运行wordcount,却总是报一个异常
java.io.IOException: Failed to set permissions of path: \XX..XX\.staging to 0700
at org.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:691)
at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:664)
at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:514)
at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:349)
at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:193)
at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:126)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:942)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:1)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:936)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:550)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:580)
at com.shidan.mapred.CombinerTest.main(CombinerTest.java:41)
并且运行的时候会在主机的本地磁盘上创建上述path的目录结构,该path应该是在eclipse所在的磁盘分区根目录下的,比如说我的eclipse是安装在D盘里面的,所以上面的路径在我电脑上就是D:\XX..XX\.staging
(该路径其实是hadoop中配置项
mapreduce.jobtracker.staging.root.dir的值)
很是纳闷,明明是run on hadoop的呀,跟我的本地文件系统有什么关系,不解。google一番后,有人提到run on hadoop其实会在本地运行job,只不过会用到远程的hdfs,这样的话,倒是可以理解为什么会报这个错误,因为尝试在windows文件系统中去设置linux中的权限。既然在本地跑Job,那跟我直接在eclipse里面run as java application有什么区别呢?于是直接run as application,发现也报同样的错误,好像没有什么区别!仔细看该异常,是在FileUtil类中
checkReturnValue
方法里面抛出来的,于是乎,直接将该方法里面的代码注释掉,再run on hadoop,发现可以正常输出结果啦,再试试run as application,也可以的。
虽然job能跑起来了,但是run on hadoop比run as java application有什么不同,还是没有搞清楚,暂且记下吧!
================分割线===========================
run on hadoop 和 run as java application的区别在我的另一篇文章中已经解释啦~
===>传送门