*逍遥*

代码改变世界!!!

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

 print?

1. <property>  

  1. 2.     <name>dfs.permissions</name>  
  2. 3.     <value>false</value>  
  3. 4.     <description>  
  4. 5.        If "true", enable permission checking in HDFS.  
  5. 6.        If "false", permission checking is turned off,  
  6. 7.        but all other behavior is unchanged.  
  7. 8.        Switching from one parameter value to the other does not change the mode,  
  8. 9.        owner or group of files or directories.  
  9.     </description>  
  10.  </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。

 

posted on 2017-09-08 16:10  *逍遥*  阅读(349)  评论(0编辑  收藏  举报

导航