在hdfs集群上,需要向Hdfs寫入文件,控制台會輸出以下錯誤信息: Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission den ...
在hdfs集群上,需要向Hdfs寫入文件,控制台會輸出以下錯誤信息:
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=Administrator, access=WRITE, inode="/user":root:supergroup:drwxr-xr-x
- 1
從中很容易看出是因為當前執行的用戶沒有Hdfs“/user”目錄的寫入許可權。這個問題無論是在Windows下還是Linux下執行job都經常會遇到。常見的解決方法有以下幾種。
- 關閉Hdfs的安全檢查(permission checking):將hdfs-xml中 dfs.permissions 屬性的值設置為 false 。但是這種方法的弊端是會導致Hdfs系統中所有的安全特性都被禁用,使Hdfs的安全性降低。
- Hdfs的用戶許可權是與本地文件系統的用戶許可權綁定在一起的,根據錯誤中的
Permission denied: user=Administrator, access=WRITE, inode="/user":root:supergroup:drwxr-xr-x
我們可以發現,Hdfs中的/user目錄是屬於supergroup組裡的root用戶的。因此我們可以想到用4種方法解決這個問題:
- 解決方法1是在conf/hdfs-site.xml中設置dfs.permissions的值為false,如:
[java] view plain copy
1. <property>
- 2. <name>dfs.permissions</name>
- 3. <value>false</value>
- 4. <description>
- 5. If "true", enable permission checking in HDFS.
- 6. If "false", permission checking is turned off,
- 7. but all other behavior is unchanged.
- 8. Switching from one parameter value to the other does not change the mode,
- 9. owner or group of files or directories.
- </description>
- </property>
- 解決方法2是
在系統環境變數中增加HADOOP_USER_NAME,其值為root;
或者 通過Java程式動態添加,如下:
System.setProperty("HADOOP_USER_NAME", "root");
- 解決方法3是
使用Eclipse在非hadoop運行的用戶下進行寫入hdfs文件系統中時,由於sunqw對"/"目錄沒有寫入許可權,所以導致異常的發生。解決方法即開放hadoop中的HDFS目錄的許可權,命令如下:hadoop fs -chmod 777 / 。
- 解決方法4是
如果是Linux環境,將執行操作的用戶添加到supergroup用戶組。
groupadd supergroup
usermod -a -G supergroup spry
- 1
- 2
如果是Windows用戶,在hdfs namenode所在機器添加新用戶,用戶名為執行操作的Windows用戶名,然後將此用戶添加到supergroup用戶組。
adduser Administrator
groupadd supergroup
usermod -a -G supergroup Administrator
- 1
- 2
- 3
這樣,以後每次執行類似操作可以將文件寫入Hdfs中屬於Administrator用戶的目錄內,而不會出現上面的Exception。