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」。
祝你好運!
Apache Hive、Cloudera Impala 提供的SQL接口
Apache Pig 、 Apache Spark 等用於分析和存儲在HDFS上的數據