Permission denied: user=administrator, access=WRITE, inode="/":root:supergroup:drwxr-xr-x(
Posted 个子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Permission denied: user=administrator, access=WRITE, inode="/":root:supergroup:drwxr-xr-x(相关的知识,希望对你有一定的参考价值。
参考博文:http://blog.csdn.net/xiaoshunzi111/article/details/52062640
http://www.udpwork.com/item/7047.html
在此篇文章里面作者分析了hadoop的整个登录过程,对于我有用的是其中的这一段:
2.login.login();
这个会调用HadoopLoginModule的login()和commit()方法。
HadoopLoginModule的login()方法是一个空函数,只打印了一行调试日志 LOG.debug("hadoop login");
commit()方法负责把Principal添加到Subject中。
此时一个首要问题是username是什么?
在使用了kerberos的情况下,从javax.security.auth.kerberos.KerberosPrincipal的实例获取username。
在未使用kerberos的情况下,优先读取HADOOP_USER_NAME这个系统环境变量,如果不为空,那么拿它作username。否则,读取HADOOP_USER_NAME这个java环境变量。否则,从com.sun.security.auth.NTUserPrincipal或者com.sun.security.auth.UnixPrincipal的实例获取username。
如果以上尝试都失败,那么抛出异常LoginException("Can’t find user name")。
最终拿username构造org.apache.hadoop.security.User的实例添加到Subject中。
看完这一段,我明白了执行login.login的时候调用了hadoop里面的HadoopLoginModule方法,而关键是在commit方法里面,在这里优先读取HADOOP_USER_NAME系统环境变量,然后是java环境变量,如果再没有就从NTUserPrincipal等里面取。关键代码为:
- if (!isSecurityEnabled() && (user == null)) {
- String envUser = System.getenv(HADOOP_USER_NAME);
- if (envUser == null) {
- envUser = System.getProperty(HADOOP_USER_NAME);
- }
- user = envUser == null ? null : new User(envUser);
- }
OK,看到这里我的需求也就解决了,只要在系统的环境变量里面添加HADOOP_USER_NAME=hadoop(HDFS上的有权限的用户,具体看自己的情况),或者在当前JDK的变量参数里面添加HADOOP_USER_NAME这个Java变量即可。我的情况添加系统环境变量更方法。
如果是在Eclipse里面运行,修改完环境变量后,记得重启一下eclipse,不然可能不会生效。
以上是关于Permission denied: user=administrator, access=WRITE, inode="/":root:supergroup:drwxr-xr-x(的主要内容,如果未能解决你的问题,请参考以下文章
security.AccessControlException): Permission denied: user=MANGOCOOL, access=WRITE, inode="/user
Permission denied: user=root, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x
FirebaseError:[code=permission-denied]:权限缺失或不足
hive之权限问题AccessControlException Permission denied: user=root, access=WR
解决vsftpd 530 Permission denied
Hive JDBC:Permission denied: user=anonymous, access=EXECUTE, inode=”/tmp”