当我试图远程运行map-reduce作业(单词计数示例)时,我遇到了一些问题。在谷歌上搜索之后,我仍然无法实现我的目标。我很少看到关于远程调用map-reduce任务的话题。问题如下:
-
首先,我遇到权限问题:
SEVERE: PriviledgedActionException as:[user] cause:org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=[user], access=WRITE, inode="mapred":root:supergroup:rwxr-xr-x
似乎是对hdfs路径的权限拒绝。我通过设置
dfs.permissions = true
来关闭检查。有没有其他方法可以克服这个问题,但仍然保持检查。 -
然后我遇到了一个异常,说我无法访问map-reduce应用程序jar。
我的代码是:SEVERE: PriviledgedActionException as:[User] cause:java.io.FileNotFoundException: File /home/hduser/WordCount-1.0.jar does not exist.
JobConf conf = new JobConf(WordCount.class); conf.setJobName("wordcount"); conf.set("fs.default.name", "hdfs://10.97.1.91:54310"); conf.set("mapred.job.tracker", "10.97.1.91:54311"); conf.setJar("/home/hduser/WordCount-1.0.jar"); ... JobClient.runJob(conf);
似乎名称节点上的本地文件系统拒绝我访问jar文件。我该如何克服这个问题?我在stackoverflow上找到了一个链接。从链接中,jar文件的位置不是必需的。但是,如果不提供位置,name节点如何找到jar文件呢?
-
我在网上找到的教程中很少看到远程执行作业的例子。难道不建议这样做吗?
对于第一个问题,看起来[user]在HDFS上没有权限。Hadoop主要使用whoami命令来确定提交作业的用户和命令的输出是否相同。有两种方法可以解决这个问题,a)确定在HDFS上有权限的用户,例如root,并在提交作业之前添加以下行。System.setProperty("HADOOP_USER_NAME","根");b)扮演。请查看以下链接http://hadoop.apache.org/docs/stable/Secure_Impersonation.html