从 "org.apache.hadoop.security.AccessControlException:Permission denied: user=..." 看Hadoop ...

假设远程提交任务给Hadoop 可能会遇到 "org.apache.hadoop.security.AccessControlException:Permission denied: user=..." , 当然,假设是spark over YARN, 也相同会遇到相似的问题,比如:

 An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext.
: org.apache.hadoop.security.AccessControlException: Permission denied: user=abel, access=WRITE, inode="/user/abel/.sparkStaging/application_1460633311001_0032":hdfs:hdfs:drwxr-xr-x

hadoop 的用户鉴权是基于JAAS的。当中hadoop.security.authentication属性 有simple 和kerberos 等方式。假设hadoop.security.authentication等于”kerberos”,那么是“hadoop-user-kerberos”或者“hadoop-keytab-kerberos”。否则是“hadoop-simple”。 当用户登陆的时候。若org.apache.hadoop.security.User为空,那么说明尚未登录过,调用静态方法getLoginUser()创建org.apache.hadoop.security.UserGroupInformatio实例,在getLoginUser()中又会调用HadoopLoginModule的login()和commit()方法。


在使用了kerberos的情况下。从javax.security.auth.kerberos.KerberosPrincipal的实例获取username。在没有使用kerberos时。首先读取hadoop 的系统环境变量。假设没有的话。对于windows 从com.sun.security.auth.NTUserPrincipal 获取username。对于类unix 从com.sun.security.auth.UnixPrincipal 中获得username,然后再看该用户属于哪个group,从而完毕登陆认证。


基本理解了问题的根源,那么这个“org.apache.hadoop.security.AccessControlException:Permission denied: user=...”异常信息是怎么产生的呢?远程提交,假设没有hadoop 的系统环境变量。就会读取当前主机的username,结果Hadoop集群中没有该用户。所以杯具了。


至于问题的解决,以mac 为例。 将

export HADOOP_USER_NAME = hdfs 

加入到 ~/.bash_profile 中。

 $ source  ~/.bash_profile 


接下来。继续提交任务到 hadoop 集群,everything is OK。 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值