zoukankan      html  css  js  c++  java
  • Hadoop:hdfs文件permission denied问题解析

    Cron jobs can be scheduled, but fail to write parquet file and seems due to user permission of “yarn”.
    : org.apache.hadoop.security.AccessControlException: Permission denied: user=yarn, access=WRITE, 
    inode="/user/spark/eea/trip/tripetl.parquet/key=2017101012/version=1730/_temporary/0":spark:hdfs:drwxr-xr-x

    观察报错的主要信息:

    user=yarn, access=WRITE

    用户yarn在改文件上执行写操作时被权限系统拒绝, parquet文件的权限为755

    Hadoop分布式文件系统实现了一个和POSIX系统类似的文件和目录的权限模型。每个文件和目录有一个所有者(owner)和一个组(group)。文件或目录对其所有者、同组的其他用户以及所有其他用户分别有着不同的权限。对文件而言,当读取这个文件时需要有r权限,当写入或者追加到文件时需要有w权限。对目录而言,当列出目录内容时需要具有r权限,当新建或删除子文件或子目录时需要有w权限,当访问目录的子节点时需要有x权限。每个访问HDFS的用户进程的标识分为两个部分,分别是用户名和组名列表。每次用户进程访问一个文件或目录foo,HDFS都要对其进行权限检查:
      1、如果用户即foo的所有者,则检查所有者的访问权限rwx;
      2、如果foo关联的组在组名列表中出现,则检查组用户的访问权限r-x;
      3、否则检查foo其他用户的访问权限r-x。

    yarn和spark是同属一个组hdfs, 因此对该文件具有r-x的权限,没有W权限,因此报错

    解决方法

    方式一:
     
    在系统环境变量或者shell脚本中增加HADOOP_USER_NAME,其值为yarn;

      export HADOOP_USER_NAME=yarn

     
    或者 通过程序动态添加,如下:
      System.setProperty("HADOOP_USER_NAME", "yarn");
     
    或者在oozie里面workflow.xml中添加
      <env-var>HADOOP_USER_NAME=hdfs</env-var>
     
    具体请参考:
      http://blog.csdn.net/lw_ghy/article/details/51469996
      https://stackoverflow.com/questions/31450828/oozie-job-wont-run-if-using-pyspark-in-sparkaction/33094709#33094709
      https://community.hortonworks.com/articles/26593/permission-denied-useryarn-accesswrite-oozie-shell.html
      https://community.hortonworks.com/questions/10949/permission-denied-for-user-while-creating-a-hive-t.html
      https://stackoverflow.com/questions/29559188/oozie-launching-mr-jobs-as-yarn-user-instead-of-given-user-name#
      https://stackoverflow.com/questions/30926357/oozie-on-yarn-oozie-is-not-allowed-to-impersonate-hadoop
     
    方式二
     
      由于yarn对"/user/spark"目录没有写入权限,所以导致异常的发生。解决方法即开放hadoop中的HDFS目录的权限,命令如下:sudo -u hdfs hdfs dfs -chmod -R 775 /user/spark  。
     
    方式三
     
    修改hadoop的配置文件:conf/hdfs-site.xml,修改 fs.permissions.umask-mode 的值。

    <property>
         <name>fs.permissions.umask-mode</name>
         <value>002</value>  
    </property>

    <property>
         <name>dfs.permissions.superusergroup</name>
         <value>hdfs</value>  
    </property>

    hdfs创建文件和目录时使用的umask,默认值为八进制022(即755),每位数字对应了拥有者,组和其他用户。即:drwxr-xr-x
     
    HDFS中超级用户与通常熟悉的Linux或Unix中的root用户不同,HDFS的超级用户是与NameNode进程有相同标示的用户。HDFS的超级用户不必是NameNode主机的超级用户。参数dfs.permissions.superusergroup设置了超级用户组,该组中的所有用户也为超级用户。超级用户在HDFS中可以执行任何操作,而针对超级用户的权限检查永远不会失败
     
    具体请参考:
      http://www.cnblogs.com/jishilei/archive/2012/12/27/2835188.html
      http://blog.csdn.net/skywalker_only/article/details/40709447
     
    方式四:
      将各个提交程序的用户名称统一为spark,即与服务器上文件所属的用户一致。

  • 相关阅读:
    Java实现 LeetCode 69 x的平方根
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 66 加一
    Java实现 LeetCode 66 加一
    CxSkinButton按钮皮肤类
  • 原文地址:https://www.cnblogs.com/ITtangtang/p/7767360.html
Copyright © 2011-2022 走看看