zoukankan      html  css  js  c++  java
  • Flume向HDFS写数据时权限问题及引发的联想

      最近小弟在用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变量即可。

  • 相关阅读:
    12月12日总结
    练习:请用索引取出下面list的指定元素:
    练习:小明身高1.75,体重80.5kg。请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数:
    练习:请利用循环依次对list中的每个名字打印出Hello, xxx!:
    练习:学员管理系统
    练习:请修改列表生成式,通过添加if语句保证列表生成式能正确地执行
    CF1067D Computer Game
    高等数学第三章
    CF755G PolandBall and Many Other Balls
    TS泛型工具
  • 原文地址:https://www.cnblogs.com/cctvyuzhou/p/9209110.html
Copyright © 2011-2022 走看看