org.apache.hadoop.security.AccessControlException
在hdfs集群上,需要向Hdfs写入文件,控制台会输出以下错误信息:
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=Administrator, access=WRITE, inode="/user":root:supergroup:drwxr-xr-x
- 1
从中很容易看出是因为当前执行的用户没有Hdfs“/user”目录的写入权限。这个问题无论是在Windows下还是Linux下执行job都经常会遇到。常见的解决方法有以下几种。
- 关闭Hdfs的安全检查(permission checking):将hdfs-xml中 dfs.permissions 属性的值设置为 false 。但是这种方法的弊端是会导致Hdfs系统中所有的安全特性都被禁用,使Hdfs的安全性降低。
- Hdfs的用户权限是与本地文件系统的用户权限绑定在一起的,根据错误中的
Permission denied: user=Administrator, access=WRITE, inode="/user":root:supergroup:drwxr-xr-x
我们可以发现,Hdfs中的/user目录是属于supergroup组里的root用户的。因此我们可以想到用4种方法解决这个问题:
- 解决方法1是在conf/hdfs-site.xml中设置dfs.permissions的值为false,如:
[java] view plain copy
1. <property>
- 2. <name>dfs.permissions</name>
- 3. <value>false</value>
- 4. <description>
- 5. If "true", enable permission checking in HDFS.
- 6. If "false", permission checking is turned off,
- 7. but all other behavior is unchanged.
- 8. Switching from one parameter value to the other does not change the mode,
- 9. owner or group of files or directories.
- </description>
- </property>
- 解决方法2是
在系统环境变量中增加HADOOP_USER_NAME,其值为root;
或者 通过Java程序动态添加,如下:
System.setProperty("HADOOP_USER_NAME", "root");
- 解决方法3是
使用Eclipse在非hadoop运行的用户下进行写入hdfs文件系统中时,由于sunqw对"/"目录没有写入权限,所以导致异常的发生。解决方法即开放hadoop中的HDFS目录的权限,命令如下:hadoop fs -chmod 777 / 。
- 解决方法4是
如果是Linux环境,将执行操作的用户添加到supergroup用户组。
groupadd supergroup
usermod -a -G supergroup spry
- 1
- 2
如果是Windows用户,在hdfs namenode所在机器添加新用户,用户名为执行操作的Windows用户名,然后将此用户添加到supergroup用户组。
adduser Administrator
groupadd supergroup
usermod -a -G supergroup Administrator
- 1
- 2
- 3
这样,以后每次执行类似操作可以将文件写入Hdfs中属于Administrator用户的目录内,而不会出现上面的Exception。