最近小弟在用flume向HDFS中写数据的时候flume报错:

  org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security .AccessControlException: Permission denied: , access=WRITE, inode="hadoop": hadoop:supergroup:rwxr-xr-x

        根据字面意思很容易知道这是Administrator用户的WRITE操作被拒绝,修改对应文件夹下权限即可解决hadoop fs -chmod 777 /XXX(文件夹名称)PS:网上还有一种解决方案:在hdfs的配置文件中,将dfs.permissions修改为False,我试过对我不好使。

        大家也看到user=Administrator,因为我是Windows系统安装Flume向Linux系统的HDFS写数据,在Linux上看到这个用户名怎么看怎么别扭,就像能不能修改掉。

        因为默认的是我的Windows的当前登录名,如果我新建个用户叫root或者hadoop肯定可以解决,但是新建个账户这种方法在生产环境不太建议。所以继续寻求别的方法。

        在这篇文章中看到这样一段话http://www.udpwork.com/item/7047.html

 

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中。

    这里优先读取HADOOP_USER_NAME系统环境变量,然后是java环境变量,如果再没有就从NTUserPrincipal等里面取。

    那我们只要在系统的环境变量里面添加HADOOP_USER_NAME=xxxx(HDFS上的有权限的用户,具体看自己的情况),或者在当前JDK的变量参数里面添加HADOOP_USER_NAME这个Java变量即可。

posted on 2018-06-21 15:02  七调  阅读(701)  评论(0编辑  收藏  举报