除纱线(MRv2)或mapred(MRv1)以外的用户提交Hadoop作业失败

时间:2014-06-24 15:10:12

标签: hadoop hadoop2

我正在运行运行MRv1(CDH5)与LocalFileSystem配对的测试集群,并且我能够运行作业的唯一用户是mapred(因为mapred是启动jobtracker / tasktracker守护程序的用户)。以任何其他用户身份提交作业时,作业会失败,因为jobtracker / tasktracker无法在.staging目录下找到job.jar。

我与YARN(MRv2)在与LocalFileSystem配对时遇到了完全相同的问题,即当由' yarn'以外的用户提交作业时,应用程序主机无法找到job.jar下的.staging目录。

在检查提交作业的用户的.staging目录时,我发现job.jar存在于.staging //目录下,但是和.staging目录的权限设置为700(drwx ----- - )因此应用程序master / tasktracker无法访问job.jar和支持文件。

我们正在使用LocalFileSystem运行测试集群,因为我们在生产设置中仅使用与OCFS配对的Hadoop项目的MapReduce部分。

在这方面的任何帮助都会非常有帮助。

2 个答案:

答案 0 :(得分:1)

您需要为群集中的每个用户设置暂存目录。这并不像听起来那么复杂。

检查以下属性:

<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop-${user.name}</value>
<source>core-default.xml</source>
</property>

这基本上为每个用户设置了一个tmp目录。

将此与您的暂存目录联系起来:

<property>
<name>mapreduce.jobtracker.staging.root.dir</name>
<value>${hadoop.tmp.dir}/mapred/staging</value>
<source>mapred-default.xml</source>
</property>

让我知道这是否有效或是否已经这样设置。

这些属性应该在yarn-site.xml中 - 如果我没记错的话。

答案 1 :(得分:1)

这对我有用,我只是在MR v1中设置了这个属性:

<property>
    <name>hadoop.security.authorization</name>
    <value>simple</value>
  </property>

请仔细阅读:

访问控制列表 $ {HADOOP_CONF_DIR} /hadoop-policy.xml为每个Hadoop服务定义访问控制列表。每个访问控制列表都有一个简单的格式:

用户和组列表都是逗号分隔的名称列表。这两个列表用空格分隔。

示例:user1,user2 group1,group2。

如果只提供一个组列表,则在行的开头添加一个空格,等效的是以逗号分隔的用户列表,后面跟一个空格,或者什么都没有,只暗示一组给定的用户。

特殊值*表示允许所有用户访问该服务。

刷新服务级别授权配置 可以在不重新启动任何Hadoop主守护程序的情况下更改NameNode和JobTracker的服务级别授权配置。集群管理员可以在主节点上更改$ {HADOOP_CONF_DIR} /hadoop-policy.xml,并指示NameNode和JobTracker分别通过-refreshServiceAcl开关将其各自的配置重新加载到dfsadmin和mradmin命令。

刷新NameNode的服务级别授权配置:

$ bin / hadoop dfsadmin -refreshServiceAcl

刷新JobTracker的服务级别授权配置:

$ bin / hadoop mradmin -refreshServiceAcl

当然,可以使用$ {HADOOP_CONF_DIR} /hadoop-policy.xml中的security.refresh.policy.protocol.acl属性来限制对某些用户/组刷新服务级别授权配置的权限

实例 只允许mapreduce组中的用户alice,bob和users将作业提交到MapReduce集群:

<property>
     <name>security.job.submission.protocol.acl</name>
     <value>alice,bob mapreduce</value>
</property>

仅允许以属于组数据节点的用户身份运行的DataNode与NameNode进行通信:

<property>
     <name>security.datanode.protocol.acl</name>
     <value>datanodes</value>
</property>
Allow any user to talk to the HDFS cluster as a DFSClient:

<property>
     <name>security.client.protocol.acl</name>
     <value>*</value>
</property>