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,即與服務器上文件所屬的用戶一致。