虚拟机里让 Hadoop 以 root 身份运行,核心要配置 SSH 免密登录、HDFS 目录写权限、YARN 临时目录权限,否则启动 Datanode 或者提交 MapReduce 任务时会频繁报权限错误。
虚拟机 Hadoop root 权限配置:先解决 SSH 免密登录
Hadoop 的 NameNode 需要通过 SSH 免密登录到所有 DataNode,root 用户也一样,多数情况下,start-dfs.sh 卡住或报 localhost: Permission denied,问题都出在 SSH。
确认主机名和 hosts 文件
hostnamectl set-hostname hadoop-node保持所有节点主机名唯一。/etc/hosts里写入每台机器的 IP 和主机名,避免 SSH 走 DNS。- root 的
~/.ssh目录属主必须为 root,权限为 700。
生成密钥对并分发
ssh-keygen -t rsa -b 4096 -P "" -f /root/.ssh/id_rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@hadoop-node1
ssh-copy-id -i /root/.ssh/id_rsa.pub root@hadoop-node2
测试时执行 ssh root@hadoop-node1,能直接返回提示符就说明免密成功,注意 /root/.ssh/authorized_keys 文件权限要改成 600。
常见误区
- 生成了密钥但对每个节点没有分发,NameNode 仍然要输密码。
- 克隆虚拟机后主机名和 SSH host key 冲突,连接报 REMOTE HOST IDENTIFICATION HAS CHANGED。
- 使用 sudo 切换到 root 时没有带
-i,环境变量和 HOME 不完整,导致 SSH 找不到密钥。
HDFS 目录权限和本地目录权限怎么改
root 用户虽然拥有全部 Linux 权限,但 HDFS 有自己的权限模型,它在 NameNode 端做检查,hadoop root 权限配置的难点就在这里:你以为自己是 root 就能写所有路径,实际还要给 HDFS 目录授权。
格式化前先规划 Namenode 和 Datanode 数据目录
- 在
core-site.xml中配置hadoop.tmp.dir,统一指向/data/hadoop/tmp。 - 在
hdfs-site.xml中配置dfs.namenode.name.dir为/data/hadoop/name。 - 配置
dfs.datanode.data.dir为/data/hadoop/data。 - 本地建目录并授权:
mkdir -p /data/hadoop/tmp /data/hadoop/name /data/hadoop/data
chown -R root:root /data/hadoop
chmod -R 755 /data/hadoop
如果目录属主不是 root,启动脚本会直接拒绝写文件,日志里出现 Permission denied 或 Failed to create storage directory。
HDFS 根目录授权
格式化之前,可以先启动 HDFS 再手动建目录:
hdfs namenode -format
start-dfs.sh
hdfs dfs -mkdir -p /user/root
hdfs dfs -chmod 750 /user/root
hdfs dfs -mkdir -p /tmp
hdfs dfs -chmod 733 /tmp
/tmp 必须给到 733,否则 MapReduce 作业提交时的 staging 目录无法写入。/user/root 用 750 就够,root 只跑自己的任务时不会和其他用户冲突。
需要改的 MapReduce 和 YARN 目录
常见报错是 Staging directory /tmp/hadoop-yarn/staging/root/.staging is not accessible,解决办法:
hdfs dfs -mkdir -p /tmp/hadoop-yarn/staging
hdfs dfs -chmod -R 733 /tmp/hadoop-yarn/staging
如果修改后仍然失败,可以在 yarn-site.xml 中显式指定 staging 目录到 /user/root/staging,然后执行 hdfs dfs -chmod 750 /user/root/staging,行业共识认为,能不用全局关闭权限检查就不用,否则其他 HDFS 用户的安全策略全部失效。
YARN 临时目录与 root 运行权限的坑
YARN 的 NodeManager 需要在本地目录写容器日志和中间结果,在虚拟机上以 root 跑 Hadoop,很多人漏了这两项配置。
yarn-site.xml 中的目录配置
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/data/hadoop/nm-local</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/data/hadoop/nm-logs</value>
</property>
然后创建目录并授权:
mkdir -p /data/hadoop/nm-local /data/hadoop/nm-logs
chown -R root:root /data/hadoop/nm-local /data/hadoop/nm-logs
chmod -R 755 /data/hadoop/nm-local /data/hadoop/nm-logs
NodeManager 运行时会以 yarn 进程用户身份写这些目录,如果目录没有 755 权限,或者属主不是启动 YARN 的用户,容器启动直接失败。
启动命令必须一致
- 用
start-all.sh或者分开执行start-dfs.sh+start-yarn.sh,都要保持当前 shell 是 root。 - 不要一会儿用 root 启动 NameNode,一会儿用普通用户启动 DataNode,数据目录属主会乱。
- 每台虚拟机都要同步改
/etc/profile里的JAVA_HOME和HADOOP_HOME,否则远程脚本找到不同版本的 Java,会触发奇怪的文件锁错误。
实测排查步骤
tail -100 /data/hadoop/nm-logs//yarn-nodemanager.log
ls -ld /data/hadoop/nm-local
如果日志里出现 org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Failed to initialize,大概率是本地目录没有写权限,重新执行 chown -R root:root 后,再重启 yarn nodemanager。
虚拟机 Hadoop root 权限常见问题排查
业内专家指出,权限报错大多集中在 SSH 和临时目录两类,下面按优先级列出排查路径。
root 启动 start-dfs.sh 报 permission denied
- 先看
logs/hadoop-root-namenode-<hostname>.log,是否提示本地目录不可写。 - 执行
hdfs dfs -ls /tmp,确认/tmp权限是 733。 - HDFS 客户端报
Permission denied by sticky bit,多半是/tmp权限太高或太低,使用hdfs dfs -chmod 733 /tmp。
提交 WordCount 时 .staging 目录不可访问
- 执行
hdfs dfs -mkdir /tmp/hadoop-yarn/staging,再hdfs dfs -chmod -R 733 /tmp/hadoop-yarn/staging。 - 在
mapred-site.xml里配置mapreduce.jobhistory.address指向历史服务器地址。 - 修改配置后必须重启 ResourceManager 和 NodeManager,否则新的目录权限不会生效。
Datanode 节点本地目录权限不一致
- 每个虚拟机的
/data/hadoop/data都要做chown root:root。 - 检查
/data/hadoop/data/current/VERSION是否存在,如果某台机器没有这个文件,说明该节点没被成功格式化。 - 不同节点 HDFS 集群 ID 不一致时,会报
Incompatible clusterIDs,删掉该节点current目录重新启动即可。
权限配置检查清单
| 检查项 | 预期效果 | 常用命令 |
|---|---|---|
| SSH 免密 | 节点间免密跳转 | ssh root@hadoop-node1 |
| HDFS /tmp | 733 | hdfs dfs -ls -d /tmp |
| YARN staging | 733 | hdfs dfs -ls -d /tmp/hadoop-yarn/staging |
| 本地数据目录 | root 属主 | ls -ld /data/hadoop |
| NodeManager 日志目录 | root 可写 | ls -ld /data/hadoop/nm-logs |
虚拟机 Hadoop root 权限配置高频问题
root 跑 Hadoop 和普通用户配置有哪些区别?
普通用户需要把 /home/hadoop 下所有文件属主改成该用户,配置 SSH 密钥时也不能覆盖其他用户,root 的差异主要在本地目录和 HDFS 目录都要显式授权,因为 HDFS 的权限模型不认 Linux 的超级用户,多数情况下,把 hadoop.tmp.dir 指到 root 有写权限的独立分区,能少踩很多坑。
可以直接关掉 dfs.permissions.enabled 吗?
不建议直接关闭,只适合临时验证,关闭后 HDFS 不再做属主和权限检查,任务能跑通,但后续换回正常配置时,所有目录权限没对齐,反而更难排查,更稳妥的做法是保留权限检查,把 /tmp 和 staging 目录权限调到 733。
修改权限后还需要重新格式化吗?
不需要,权限只影响运行时的读写,不会改变集群 ID 和数据块元数据,改完 hdfs-site.xml 或目录属主后,重启对应服务就行,执行 stop-all.sh,然后再 start-all.sh,如果强制重新格式化,原有数据会全部丢失。
这样配置完,虚拟机里 Hadoop 以 root 运行的权限问题基本都能解决,后续再遇到报错,优先查日志里的 Permission denied 发生在哪一层。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/624821.html





