HDFS临时目录权限问题与YARN MapReduce框架配置异常排查
Hadoop 3.3.4双节点集群多用户场景配置问题解决
问题1:/tmp/hadoop-yarn权限拦截普通用户作业
启动JobHistory Server后,它以mapred用户身份创建的/tmp/hadoop-yarn目录权限为drwxrwx---,普通用户(比如joe)没有执行权限,导致提交YARN作业时抛出AccessControlException。
解决思路:配置多用户隔离的临时目录
不要直接修改默认目录权限(安全性差),通过配置文件指定用户专属的临时路径:
- 编辑
mapred-site.xml,设置MapReduce AM的staging目录为用户专属路径:
<property> <name>yarn.app.mapreduce.am.staging.dir</name> <value>/tmp/hadoop-${user.name}/staging</value> <description>MapReduce Application Master的临时 staging 目录,按用户隔离</description> </property>
- 编辑
yarn-site.xml,调整YARN节点管理器的本地存储和日志目录,避免权限冲突:
<property> <name>yarn.nodemanager.local-dirs</name> <value>/tmp/hadoop-yarn/nm-local-${user.name}</value> </property> <property> <name>yarn.nodemanager.log-dirs</name> <value>/tmp/hadoop-yarn/nm-log-${user.name}</value> </property>
如果不需要严格的用户隔离,也可以把默认的yarn.nodemanager.local-dirs目录权限改成777,但隔离方式更适合多用户场景。
问题2:配置staging目录后出现log4j警告导致AM启动失败
改完staging目录后,作业失败并弹出log4j警告,原因是MapReduce AM容器启动时找不到log4j.properties配置文件——默认情况下,AM的classpath没包含Hadoop的配置目录,所以加载不到配置。
解决方法:让AM容器能加载log4j配置
推荐用以下两种方式中的一种:
方式一:修改mapred-site.xml添加classpath配置
在mapred-site.xml里添加AM的classpath配置,把Hadoop配置目录包含进去:
<property> <name>mapreduce.application.classpath</name> <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*,$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*,$HADOOP_CONF_DIR</value> </property>
这样AM启动时就能加载到$HADOOP_CONF_DIR下的log4j.properties了。
方式二:手动上传log4j.properties到staging目录(不推荐)
提交作业前,把$HADOOP_HOME/etc/hadoop/log4j.properties上传到用户的staging目录,但每次提交都要操作,太麻烦,不如方式一省心。
完整修正后的操作流程
- 先停掉所有Hadoop服务:
[hdfs] $ $HADOOP_HOME/sbin/stop-all.sh
- 修改
mapred-site.xml和yarn-site.xml中的上述配置,注意同步到集群所有节点 - 重启服务:
[hdfs] $ $HADOOP_HOME/sbin/start-dfs.sh [yarn] $ $HADOOP_HOME/sbin/start-yarn.sh [mapred] $ mapred --daemon start historyserver
- 确保用户HDFS目录存在(之前已经做过的话可以跳过):
[hdfs] $ hdfs dfs -mkdir -p /user/joe [hdfs] $ hdfs dfs -chown joe:joe /user/joe
- 提交测试作业:
[joe] $ yarn jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar pi 1 10
额外提醒
- 所有配置修改后必须同步到集群的所有节点,不然会出现节点间配置不一致的问题
- Hadoop会自动创建用户专属的
/tmp/hadoop-${user.name}目录,权限默认是700,不用手动创建;如果手动创建,记得设置正确权限 - 如果JobHistory Server的日志也存在权限问题,可以在
mapred-site.xml里配置mapreduce.jobhistory.done-dir和mapreduce.jobhistory.intermediate-done-dir为用户隔离路径,比如/tmp/hadoop-${user.name}/history
内容的提问来源于stack exchange,提问作者mkvakic-srce
相关产品推荐
相关产品推荐

