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

观察报错的主要信息:html

user=yarn, access=WRITE

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

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

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

 

解决方法

方式一:
 
在系统环境变量或者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>
oop

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,即与服务器上文件所属的用户一致。
相关文章
相关标签/搜索