Hadoop MapReduce作业以用户身份运行在/user/thread/.staging目录上出现权限错误

Hadoop MapReduce作业以用户身份运行在/user/thread/.staging目录上出现权限错误,hadoop,mapreduce,hive,yarn,oozie,Hadoop,Mapreduce,Hive,Yarn,Oozie,我有一个Oozie工作流运行一个配置单元操作。配置单元操作非常简单,它只是从一个表读取副本到另一个表。作业运行时具有以下属性: user.name=yarn mapreduce.job.user.name=cloudfeeds 作业失败,出现以下错误: 15/07/16 18:45:25 INFO mapreduce.Job: Job job_1435680786374_0060 failed with state FAILED due to: Application application_

我有一个Oozie工作流运行一个配置单元操作。配置单元操作非常简单,它只是从一个表读取副本到另一个表。作业运行时具有以下属性:

user.name=yarn
mapreduce.job.user.name=cloudfeeds
作业失败,出现以下错误:

15/07/16 18:45:25 INFO mapreduce.Job: Job job_1435680786374_0060 failed with state FAILED due to: Application application_1435680786374_0060 failed 2 times due to AM Container for appattempt_1435680786374_0060_000002 exited with  exitCode: -1000
For more detailed output, check application tracking page:http://master-1.local:8088/proxy/application_1435680786374_0060/Then, click on links to logs of each attempt.
Diagnostics: Permission denied: user=cloudfeeds, access=EXECUTE, inode="/user/yarn/.staging":yarn:hdfs:drwx------
    at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkFsPermission(FSPermissionChecker.java:271)
    at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:257)
    at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:208)
    at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:171)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:6795)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:4387)
    at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:855)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getFileInfo(ClientNamenodeProtocolServerSideTranslatorPB.java:835)
    at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:619)
    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:962)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2039)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2035)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2033)
我不明白为什么用户cloudfeeds需要访问/user/warn/.staging目录。如果作业作为用户cloudfeeds运行,它不应该尝试访问/user/cloudfeeds/.staging吗

我该如何解决这个问题

谢谢,
-shinta

向cloudfeeds用户授予登台目录的权限。任何执行应用程序的用户都需要访问临时目录。因此,要么为所有这些用户所属的组设置acl,要么盲目地授予777权限

chmod 777 /user/yarn/.staging

运行下面的hdfs命令

hadoop fs -chmod -R 1777 /user/yarn/.staging
-R表示应用于其所有子目录。上面的命令将所有用户的完全权限应用于该目录及其所有子目录

或者,如果启用了ACL,则可以为特定用户设置权限,如下所示:

hadoop fs -setfacl -m -R user:cloudfeeds:rwx /user/yarn/.staging

虽然我不完全理解为什么,但当我们从HDP2.2.4升级到HDP2.2.6时,问题就消失了。我们没有更改任何代码或任何配置文件。

如果您验证了core-site.xml,则应为所有具有

  <property>
            <name>hadoop.proxyuser.oozie.hosts</name>
            <value>*</value>
    </property>
    <property>
            <name>hadoop.proxyuser.oozie.groups</name>
            <value>*</value>
    </property>

hadoop.proxyuser.oozie.hosts
*
hadoop.proxyuser.oozie.groups
*
同时检查hdfs-site.xml权限状态意味着什么,它应该设置为false:

 <property>
    <name>dfs.permissions</name>
    <value>false</value>
  </property>

dfs.0权限
假的

这可能有助于挖掘不起作用的问题

,因为每次作业运行时,/user/warn/.staging目录都会返回到已损坏的权限。chmod不起作用,因为每当Oozie作业运行时,权限会一直返回到700。因此,您可以设置ACL。参考