问题
“权限被拒绝”错误可能出现在各种用例和几乎任何使用CDH的应用程序中。
例如,尝试使用此命令启动jobtracker时:
service hadoop-0.20-mapreduce-jobtracker start
您可能会看到此错误或类似错误:
org.apache.hadoop.security.AccessControlException: Permission denied: user=mapred, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:224) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:204) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:149) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:4891) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:4873) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkAncestorAccess(FSNamesystem.java:4847) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirsInternal(FSNamesystem.java:3192) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirsInt(FSNamesystem.java:3156) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:3137) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.mkdirs(NameNodeRpcServer.java:669)
虽然重现此错误的步骤可能有很大差异,但根本原因非常明确,您可以通过在 stdout 或相关日志文件中查找以下行来了解此问题:
org.apache.hadoop.security.AccessControlException: Permission denied: user=XXX, access=WRITE, inode="/someDirectory":hdfs:supergroup:drwxr-xr-x
适用条件
CDH(所有版本),Mapreduce,HDFS,依赖于读取或写入HDFS的其他服务
原因
未正确配置对HDFS文件系统的访问和/或某些目录的权限。
故障排除步骤
有几种可以尝试的解决方案:
- /user/ 目录由
hdfs
拥有,具有755
权限。因此,只有hdfs
可以写入该目录。与unix/linux
不同,hdfs
是超级用户而不是root
用户。所以你需要这样做:
sudo -u hdfs hadoop fs -mkdir /user/,,myfile,,
sudo -u hdfs hadoop fs -put myfile.txt /user/,,/,,
如果要为root
创建主目录以便将文件存储在其目录中,请执行以下操作:
sudo -u hdfs hadoop fs -mkdir /user/root
sudo -u hdfs hadoop fs -chown root /user/root
然后你可以以root
身份执行:
hadoop fs -put file /user/root/
- 在namenode应该监听的网络端口上,您也可能被拒绝:
通过在/etc/hadoop/conf/core-site.xml
中更改服务正在侦听的地址来解决此问题。默认情况下,NameNode可能正在侦听localhost:8020(127.0.0.1)
所以要清楚,为以下属性实现此值:
<property>
<name>fs.defaultFS</name>
<value>hdfs://0.0.0.0:8020</value>
</property>
然后使用hadoop-hdfs-namenode
重启服务
可选:使用netstat -tupln | grep 8020
验证