5

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

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

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

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

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

4

2 回答 2

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 中。

于 2014-07-03T15:31:03.193 回答
1

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

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

请通过这个:

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

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

示例:用户 1、用户 2 组 1、组 2。

如果只提供组列表,则在行首添加一个空格,等效于逗号分隔的用户列表,后跟一个空格,或者什么都不意味着只提供一组给定用户。

* 的特殊值意味着允许所有用户访问该服务。

刷新服务级别授权配置 NameNode 和 JobTracker 的服务级别授权配置可以更改,而无需重新启动任何一个 Hadoop 主守护程序。集群管理员可以在master节点上修改${HADOOP_CONF_DIR}/hadoop-policy.xml,并通过-refreshServiceAcl切换到dfsadmin和mradmin命令分别指示NameNode和JobTracker重新加载各自的配置。

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

$ bin/hadoop dfsadmin -refreshServiceAcl

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

$ bin/hadoop mradmin -refreshServiceAcl

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

示例只允许用户 alice、bob 和 mapreduce 组中的用户向 MapReduce 集群提交作业:

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

只允许以属于组 datanodes 的用户身份运行的 DataNodes 与 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>
于 2014-07-03T15:38:26.253 回答