1. 程式人生 > >Spark/HDFS上傳檔案錯誤:Permission denied

Spark/HDFS上傳檔案錯誤:Permission denied

問題描述

今天用spark將RDD結果輸出到HDFS時,因為CDH叢集重新配置的原因,許可權沒有設定好。導致寫檔案出bug。

錯誤情況

org.apache.hadoop.security.AccessControlException: Permission denied: user=xiet, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x

解決方法

1、對非CDH使用者,到Namenode上修改hadoop的配置檔案:conf/hdfs-core.xml, 找到 dfs.permissions 的配置項 , 將value值改為 false

<property>
<name>dfs.permissions</name>
<value>false</value>
<description>
If "true", enable permission checking in HDFS.
If "false", permission checking is turned off,
but all other behavior is unchanged.
Switching from one parameter value to the other does not change the mode,
owner or group of files or directories.
</description>
</property>

修改完之後,要重啟下hadoop的服務才能生效。

2、對CDH使用者:假設系統有一個資料夾/user/directory,注意,這個資料夾的擁有者不是所謂的“root”。實際上,這個資料夾為“hdfs”所有(755許可權,這裡將hdfs理解為一個屬於supergroup的使用者)。 
所以,只有hdfs可以對資料夾進行寫操作。與Unix/Linux不同,hdfs是超級使用者(superuser),而不是root。 
所以,當你想要進行建立資料夾或者上傳檔案等操作的時候,可以這麼做:

sudo -u hdfs hdfs dfs -mkdir /user/intern/test67

這裡寫圖片描述
同理,上傳檔案:

sudo -u hdfs hdfs dfs -put myfile.txt /user/intern/test67

顯然,上面的方法麻煩在於:每當進行一次操作的時候,都需要切換成hdfs使用者。這在spark-shell開發程式倒還好,但是對提交作業的時候,顯然是很不方便的。

這裡,我們可以建立一個資料夾,更改其許可權為root(或你的使用者名稱)。所以,你可以向這個資料夾隨意的存、改檔案了。

sudo -u hdfs hadoop fs -chown root /user/intern/test67

沒執行這條命令時: 
這裡寫圖片描述

執行這條命令時: 
這裡寫圖片描述