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变量即可。

  • 相关阅读:
    DOS命令如何删除文件和文件夹
    屏蔽电信流氓弹出广告
    Wcf客户端配置里Endpoint的Name属性无效
    正则替换中的一个Bug
    【原】解决 iframe 在 iPad 上不能滚动的问题
    【原】JSON.parse() 和 JSON.stringify()
    【原】SQL 使用 PIVOT 和 UNPIVOT 行转列 列转行
    【原】How to fix: Handler “PageHandlerFactoryIntegrated” has a bad module “ManagedPipelineHandler” in its module list
    【原】DES Encrypt / Decrypt
    【原】JSON.parse() 和 JSON.stringify()
  • 原文地址:https://www.cnblogs.com/cctvyuzhou/p/9209110.html
Copyright © 2011-2022 走看看