HDFS

Hadoop HDFS 文件訪問權限問題致使Java Web 上傳文件到Hadoop失敗的緣由分析及解決方法

1. 問題描述:html

         Eclipse中開發Java Web程序,使用Hadoop-Core JAR包中的Java API,上傳文件到Hadoop HDFS文件系統中,上傳提示成功,可是在Hadoop集羣中經過「hadoop fs –ls /xxx」命令卻沒法查看到相應的上傳文件。java

2. 問題緣由分析:node

         其實,本次文件上傳並未成功!在Tomcat中觀察運行結果,會發現已經出現了Exception「org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=bikun, access=WRITE, inode="/user":user:supergroup:drwxr-xr-x」 !!web

         獲得的教訓:在編寫Java Web程序時,應該多使用「try , catch」語句,在運行Java Web程序中,須要多觀察Tomcat的輸出結果!shell

         從上段提示中能夠看出,提示「security.AccessControlException」(訪問控制異常),致使的結果是「Permission denied」(許可被拒絕),由於「user=bikun, access=WRITE」(當前用戶名爲「bikun」,他想「寫文件」),可是當前文件夾的主人是「user」(「 inode="/user":user:supergroup」),而且訪問控制位是「rwxr-xr-x」(即文件全部者「user」是可讀寫執行「rwx」,所在組「supergroup」是可讀可執行「r-x」,其它用戶是可讀可執行「r-x」)。看到此處,緣由已經明朗:由於除了「user」用戶以外,其它用戶不能寫!而當前用戶「bikun」卻想上傳(寫)一個文件到「user」目錄,違反了訪問控制規則,致使拋出「security.AccessControlException」(訪問控制異常)。apache

3. 問題的解決方法windows

3.1 建立相應子目錄,並修改子目錄的全部者名稱tomcat

         在Hadoop集羣的shell中,運行「hadoop  fs   –ls  / 」,結果以下圖,能夠看到」/user」目錄的訪問控制權限是「rwx  r-x  r-x」,子目錄「/user/user」的訪問控制權限也是「rwx  r-x  r-x」安全

         當前想上傳文件的用戶名是「bikun」(在windows/Linux環境下,當前用戶名就是登陸windows/Linux時使用的用戶名),咱們可使用命令「hadoop  fs  -mkdir  /user/bikun」,在hadoop的「/user」目錄中,創建子目錄「bikun」(注意,執行次命令時,要保證當前登陸所使用的用戶名是「user」,若是你安裝hadoop時使用的用戶名是「xxx」,那麼本文中全部的「user」都應該替換爲「xxx」)。而後咱們使用命令「hadoop  fs  -chown  bikun:supergroup  /user/bikun」,修改子目錄「bikun」的擁有者爲用戶「bikun」(由於該目錄是「user」用戶建立的,因此,初始擁有者是「user」),若是你使用「kkk」用戶登陸,則須要把本文中的全部「bikun」替換爲「kkk」。這幾步的運行結果以下圖所示:oop

Question & Answer:

1)Q: 爲何要建立一個名字爲「bikun」的目錄?

     A: 由於當前windows登陸的用戶名爲「bikun」,此時他想經過Java web 上傳一個文件到Hadoop HDFS中,按照Hadoop 1.x 版本的規定,當前用戶名爲登陸用戶名。若是你使用「kkk」用戶登陸,則須要把本文中的全部「bikun」替換爲「kkk」。

2)Q:爲何「bikun」子目錄須要創建在「/user」目錄下面?

     A:由於,按照Hadoop 1.x 版本的規定,上傳的文件默認都會放在「/user」目錄中,而且根據當前用戶名,創建相應的子目錄,具體文件存放在相應的子目錄中。

3)Q:爲何須要修改「/user/bikun」目錄的全部者名字(由「user」改成「bikun」)?

     A:由於從上圖的「訪問權限位」能夠看出,只有目錄的全部者纔有「寫」(w)的權限,將目錄「/user/bikun」的全部者改成「bikun」,你就能夠在windows/Linux下,使用「bikun」用戶登陸並上傳文件了。

       進行上述操做後,就可以成功的上傳文件了。進行了三次上傳文件的測試,均成功了,使用「hadoop  fs  -ls  /user/bikun 」能夠查看到上傳的文件,以下圖所示。

 

3.2開放「/user」目錄的「寫」權限

         使用「3.1」的方法,可以實現使用用戶名「bikun」上傳文件,可是若是要使用其它用戶上傳文件,則須要再按照上述步驟操做一遍,有點麻煩。

         若是咱們放開「/user」目錄的「寫」權限,則能夠一步解決。固然,這僅是走捷徑,違反了「訪問控制權限」的設計邏輯,安全性很差。可是,若是這個hadoop就是供你使用的,也無妨。

         在當前登陸用戶名爲「user」時,使用命令「hadoop  fs  -chmod  777  /user」,修改「/user」目錄的訪問權限爲全部人「可讀可寫可執行」(「rwx rwx rwx」),這樣,全部用戶均可以在「/user」目錄下創建文件或文件夾了,以下圖所示。

         

         執行上述步驟後,在登陸用戶爲「bikun」時,成功的在Java web中上傳文件到Hadoop,經過命令「hadoop  fs  -ls  /user」能夠看到,系統自動在「/user」目錄下建立了子目錄「bikun」,以下圖所示。

查看子目錄「bikun」,會看到裏面確實有上傳的文件,以下圖所示。

3.3  修改hadoop的配置文件「hdfs-site.xml」,取消「訪問控制檢查」。

         首先運行「stop-all.sh」中止Hadoop的運行,而後打開hadoop的conf目錄下的配置文件「hdfs-site.xml」,加入如下配置內容後,再使用命令「start-all.sh」從新啓動hadoop。

<property>

<name>dfs.permissions</name>

<value>false</value>

</property> 

         配置說明:「dfs.permissions」的值爲「false」時,hadoop不進行「訪問控制」檢查,所以,上傳文件老是可以成功。

         注意事項有兩點:

1)修改了「hdfs-site.xml」文件後,必定要重啓hadoop纔能有效。

2)「dfs.permissions」的拼寫必定要正確。我就是把「permissions」錯誤的寫成了「pemissions」,致使一直上傳失敗,該錯誤比較隱蔽,花了很久,折騰了不少,才發現了這個低級錯誤。

3.4 使用「user」用戶登陸

         這多是最簡單的解決方法了。在windows/Linux下,使用「user」用戶登陸,就OK了。上傳的文件都在目錄「/user/user」中。

         最後還得重複一下,本例中的「user」用戶表明「安裝hadoop時使用的用戶」,若是你安裝hadoop時使用的用戶名是「xxx」,那麼本文中全部的「user」都應該替換爲「xxx」。本例中的「bikun」用戶表明上傳文件時登陸windows/Linux的用戶,若是你使用「kkk」用戶登陸,則須要把本文中的全部「bikun」替換爲「kkk」。

     祝你好運!


Analyze data stored on HDFS

Apache Hive、Cloudera Impala 提供的SQL接口

Apache Pig 、 Apache Spark 等用於分析和存儲在HDFS上的數據

相關文章
相關標籤/搜索