【Hadoop & Ecilpse】Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=bruce, access=WRITE, inode="/out2/_temporary/0":atguigu:supergroup:drwxr-xr-x


問題再現:

  使用本機 Ecilpse  (Windows環境) 去訪問遠程 hadoop 集群出現以下異常:

  

問題原因:

  因為遠程提交的情況下如果沒有 hadoop 的系統環境變量,就會讀取當前主機的用戶名,所以 hadoop 集群的節點中沒有該用戶名的權限,所以出現的異常。

問題解決:

  a、如果是測試環境,可以取消 hadoop hdfs 的用戶權限檢查。打開 conf/hdfs-site.xml,找到 dfs.permissions 屬性修改為 false(默認為true),然后配置分發到其它節點,然后重啟集群。此法沒有效果。

  b、修改 hadoop location 參數,在 advanced parameter 選項卡中,找到 hadoop.job.ugi 項,將此項改為啟動 hadoop 的用戶名即可。(注意第一次設置的時候可能沒有 hadoop.job.ugi 參數,報錯后再去看就有了),此法的參數沒有找到!

  c、因為 Eclipse 使用 hadoop 插件提交作業時,會默認以 當前主機的用戶名 的身份去將作業寫入 HDFS 文件系統中,由於 當前主機的用戶名 對 hadoop 目錄並沒有寫入權限,所以導致異常的發生。

     解決方法為:放開 hadoop 目錄的權限 ,命令如下 :$ hadoop fs -chmod 777 /   # 表示為整個根目錄開放權限,不推薦此法!

  d、遠程提交,如果沒有 hadoop 的系統環境變量,就會讀取當前主機的用戶名,結果 hadoop 集群中沒有該用戶,所以就異常了。

     解決方法為:在遠程 Linux 上將 export HADOOP_USER_NAME = bruce  添加到 ~/.bash_profile 中,然后生效該文件 $ source  ~/.bash_profile 不推薦此法!

  e、執行 login.login 的時候調用了 hadoop 里面的 HadoopLoginModule 方法,而關鍵是在 commit 方法里面,在這里優先讀取 HADOOP_USER_NAME 系統環境變量,然后是 java 環境變量 中的  HADOOP_USER_NAME ,如果再沒有就從 NTUserPrincipal 等里面取。即 只要 在系統的環境變量里面添加 HADOOP_USER_NAME=xxx(xxx 是 HDFS 上的有權限的用戶,具體看自己的情況),或者在當前 JDK 的變量參數里面添加 HADOOP_USER_NAME 這個 Java變 量。推薦此法!如下圖:

  

  f、再代碼中加入 System.setProperty("HADOOP_USER_NAME", "atguigu") 此法沒有測試過!

  g、或者設置 conf/hdfs-site.xml,此法沒有測試過!

<property> 
  <name>hadoop.security.authentication</name> 
  <value>simple</value> 
</property>

附錄

  hadoop 的整個登錄過程

login.login();
這個會調用 HadoopLoginModule 的 login() 和 commit()方法。
HadoopLoginModule 的 login() 方法是一個空函數,只打印了一行調試日志 LOG.debug("hadoop login");
commit() 方法負責把 Principal 添加到 Subject 中。
此時一個首要問題是 username 是什么? 在使用了 kerberos 的情況下,從 javax.security.auth.kerberos.KerberosPrincipal 的實例獲取 username。
在未使用 kerberos 的情況下,優先讀取 HADOOP_USER_NAME 這個系統環境變量,如果不為空,那么拿它作 username。否則,讀取 HADOOP_USER_NAME 這個 java 環境變量。
否則,從 com.sun.security.auth.NTUserPrincipal 或者 com.sun.security.auth.UnixPrincipal 的實例獲取 username。 如果以上嘗試都失敗,那么拋出異常 LoginException(
"Can’t find user name")。 最終拿 username 構造 org.apache.hadoop.security.User 的實例添加到 Subject 中。

 參考

  https://blog.csdn.net/lunhuishizhe/article/details/50489849

  https://blog.csdn.net/wireless_com/article/details/51192713


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM