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

Posted llguanli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从 "org.apache.hadoop.security.AccessControlException:Permission denied: user=..." 相关的知识,希望对你有一定的参考价值。

假设远程提交任务给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。?


以上是关于从 "org.apache.hadoop.security.AccessControlException:Permission denied: user=..." 的主要内容,如果未能解决你的问题,请参考以下文章

docmd.runsql ("从 &strValue& 中删除 *")

从client(content="<p></p>")中检測到有潜在危急的 Request.Form 值。

"Hello World " —— 深入理解程序从编译到执行

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

XPath 从多个节点获取文本

如何从 POSTMAN 发送包含 xml 值的 Json?