Hadoop:hdfs文件permission denied問題解析(xi)
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
觀察報錯的(de)主要(yao)信息:
user=yarn, access=WRITE
用戶yarn在改文件(jian)上(shang)執(zhi)行寫操作時被(bei)權限系統拒絕, parquet文件(jian)的權限為755
Hadoop分布式文(wen)(wen)件(jian)系(xi)統(tong)實現了一個(ge)(ge)和(he)POSIX系(xi)統(tong)類似(si)的(de)文(wen)(wen)件(jian)和(he)目(mu)錄(lu)的(de)權(quan)(quan)限模型。每(mei)個(ge)(ge)文(wen)(wen)件(jian)和(he)目(mu)錄(lu)有(you)(you)一個(ge)(ge)所(suo)有(you)(you)者(owner)和(he)一個(ge)(ge)組(zu)(group)。文(wen)(wen)件(jian)或目(mu)錄(lu)對其所(suo)有(you)(you)者、同(tong)組(zu)的(de)其他(ta)(ta)用(yong)(yong)戶以及所(suo)有(you)(you)其他(ta)(ta)用(yong)(yong)戶分別有(you)(you)著不同(tong)的(de)權(quan)(quan)限。對文(wen)(wen)件(jian)而(er)言(yan),當讀(du)取這(zhe)個(ge)(ge)文(wen)(wen)件(jian)時(shi)(shi)需要(yao)(yao)(yao)有(you)(you)r權(quan)(quan)限,當寫入(ru)或者追加到文(wen)(wen)件(jian)時(shi)(shi)需要(yao)(yao)(yao)有(you)(you)w權(quan)(quan)限。對目(mu)錄(lu)而(er)言(yan),當列出目(mu)錄(lu)內容(rong)時(shi)(shi)需要(yao)(yao)(yao)具(ju)有(you)(you)r權(quan)(quan)限,當新建(jian)或刪除子(zi)文(wen)(wen)件(jian)或子(zi)目(mu)錄(lu)時(shi)(shi)需要(yao)(yao)(yao)有(you)(you)w權(quan)(quan)限,當訪問(wen)目(mu)錄(lu)的(de)子(zi)節點時(shi)(shi)需要(yao)(yao)(yao)有(you)(you)x權(quan)(quan)限。每(mei)個(ge)(ge)訪問(wen)HDFS的(de)用(yong)(yong)戶進(jin)程的(de)標(biao)識分為兩個(ge)(ge)部(bu)分,分別是用(yong)(yong)戶名和(he)組(zu)名列表。每(mei)次用(yong)(yong)戶進(jin)程訪問(wen)一個(ge)(ge)文(wen)(wen)件(jian)或目(mu)錄(lu)foo,HDFS都要(yao)(yao)(yao)對其進(jin)行權(quan)(quan)限檢查:
1、如果用戶即foo的所有(you)(you)者,則檢查所有(you)(you)者的訪問權限(xian)rwx;
2、如果foo關聯的(de)組在組名列表(biao)中出現,則檢查組用(yong)戶的(de)訪問權限(xian)r-x;
3、否則檢查foo其他用戶(hu)的訪問(wen)權限r-x。
yarn和spark是同(tong)屬一個組hdfs, 因(yin)(yin)此(ci)對該(gai)文件具有r-x的(de)權(quan)限,沒有W權(quan)限,因(yin)(yin)此(ci)報錯(cuo)
解決方法:
export HADOOP_USER_NAME=yarn
<property>
<name>fs.permissions.umask-mode</name>
<value>002</value>
</property>
<property>
<name>dfs.permissions.superusergroup</name>
<value>hdfs</value>
</property>
