• 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等里面取。关键代码为:

    1. if (!isSecurityEnabled() && (user == null)) {
    2.   String envUser = System.getenv(HADOOP_USER_NAME);
    3.   if (envUser == null) {
    4.     envUser = System.getProperty(HADOOP_USER_NAME);
    5.   }
    6.   user = envUser == null ? null : new User(envUser);
    7. }

    OK,看到这里我的需求也就解决了,只要在系统的环境变量里面添加HADOOP_USER_NAME=hadoop(HDFS上的有权限的用户,具体看自己的情况),或者在当前JDK的变量参数里面添加HADOOP_USER_NAME这个Java变量即可。我的情况添加系统环境变量更方法。

    如果是在Eclipse里面运行,修改完环境变量后,记得重启一下eclipse,不然可能不会生效。

  • 相关阅读:
    javascript 之 面向对象【继承】
    javascript 之 面向对象【创建对象】
    javascript 之 函数
    EffectiveJava(26)使用泛型类替代普通类
    JAVA加解密 -- 数字签名算法
    JAVA加解密 -- 对称加密算法与非对称加密算法
    EffectiveJava(25)泛型和数组的使用取舍及规范
    EffectiveJava(24)使用@SuppressWarnings("unchecked")消除非受检警告
    EffectiveJava(23)为什么不能在新生代码中使用原生态类型
    JAVA加解密 -- 消息摘要算法
  • 原文地址:https://www.cnblogs.com/jwlfpzj/p/7193158.html
Copyright © 2020-2023  润新知