
系列文章目錄文章目錄系列文章目錄前言Shell命令與HDFS進行交互目錄操作文件操作在云服務(wù)器中安裝Eclipse安裝圖形界面。圖形界面設(shè)置為中文圖形界面的取消eclipse調(diào)試java程序1. 新建 Java 項目2. 導(dǎo)入 Hadoop 相關(guān) jar 包3. 編寫讀取 HDFS 文件的 Java 示例4. 運行結(jié)果說明5. 常見報錯與排查方法5.1 缺少依賴ClassNotFoundException / NoClassDefFoundError5.2 連接被拒絕Connection refused5.3 權(quán)限不足Permission denied5.4 文件不存在FileNotFoundException5.5 Windows 下運行報錯Could not locate executable null\bin\winutils.exe總結(jié)前言上篇文章介紹了如何在云服務(wù)器上部署hadoop本篇將介紹如何使用HDFS進行操作。Shell命令與HDFS進行交互首先要先啟動hadoop.cd/usr/local/hadoop./sbin/start-dfs.shj進行命令的查看./bin/hadoop fs./bin/hadoop fs-help put目錄操作在Hadoop系統(tǒng)安裝好以后第一次使用HDFS時需要首先在HDFS中創(chuàng)建用戶目錄。本教程全部采用hadoop用戶登錄Linux系統(tǒng)因此需要在HDFS中為hadoop用戶創(chuàng)建一個用戶目錄命令如下。cd/usr/local/hadoop./bin/hdfs dfs-mkdir-p/user/hadoop可用如下兩個命令進行顯示HDFS中與當前用戶hadoop對應(yīng)的用戶目錄下的內(nèi)容。./bin/hdfs dfs-ls../bin/hdfs dfs-ls/user/hadoop列出HDFS上的所有目錄。./bin/hdfs dfs-ls可以使用如下命令創(chuàng)建一個input目錄如果存在就不用再建了輸入命令也會給出提示信息。./bin/hdfs dfs-mkdir input要在HDFS的根目錄下創(chuàng)建一個名稱為input的目錄則需要使用如下命令。./bin/hdfs dfs-mkdir/input可以使用rm命令刪除一個目錄比如可以使用如下命令刪除剛才在HDFS中創(chuàng)建的“/input”目錄不是“/user/hadoop/input”目錄。./bin/hdfs dfs-rm-r/input文件操作在實際應(yīng)用中經(jīng)常需要從本地文件系統(tǒng)向HDFS中上傳文件或者把HDFS中的文件下載到本地文件系統(tǒng)中。首先使用vim編輯器在本地Linux文件系統(tǒng)的“/home/hadoop/”目錄下創(chuàng)建一個文件myLocalFile.txt里面可以隨意輸入一些單詞比如輸入如下三行。cd/home/hadoopvim myLocalFile.txt輸入以下內(nèi)容Hadoop Spark XMU DBLAB然后可以使用如下命令把本地文件系統(tǒng)的“/home/hadoop/myLocalFile.txt”上傳到HDFS中的當前用戶目錄的input目錄下也就是上傳到HDFS的“/user/hadoop/input/”目錄下。首先要切換至hadoop下cd/usr/local/hadoop./bin/hdfs dfs-put/home/hadoop/myLocalFile.txt input可用下面命令進行查看。./bin/hdfs dfs-lsinput下面使用如下命令查看HDFS中的myLocalFile.txt這個文件的內(nèi)容。./bin/hdfs dfs-catinput/myLocalFile.txt切換至/home/hadoop下建立download文件夾。cd ~ mkdir download下面把HDFS中的myLocalFile.txt文件下載到本地文件系統(tǒng)中的“/home/hadoop/download/”這個目錄下命令如下。cd/usr/local/hadoop./bin/hdfs dfs-get input/myLocalFile.txt/home/hadoop/download可以使用如下命令到本地文件系統(tǒng)查看下載下來的文件myLocalFile.txt。cd ~ cd download llcatmyLocalFile.txt最后了解一下如何把文件從HDFS中的一個目錄拷貝到HDFS中的另外一個目錄。比如如果要把HDFS的“/user/hadoop/input/myLocalFile.txt”文件拷貝到HDFS的另外一個目錄“/input”中注意這個input目錄位于HDFS根目錄下可以使用如下命令。cd/usr/local/hadoop./bin/hdfs dfs-cpinput/myLocalFile.txt/input可進行查看文件內(nèi)容。./bin/hdfs dfs-ls./bin/hdfs dfs-cat/input在云服務(wù)器中安裝Eclipse下載Eclipse 2021-03版本可以使用以下命令。wget https://mirrors.tuna.tsinghua.edu.cn/eclipse/technology/epp/downloads/release/2023-09/R/eclipseeclipse-cpp-2023-09-R-linux-gtk-x86_64.tar.gzsudo tar-zxvf./eclipse-cpp-2023-09-R-linux-gtk-x86_64.tar.gz-C/usr/local找到/usr/local并查看下面的內(nèi)容。安裝圖形界面。以下的代碼命令會出現(xiàn)提示輸入y即可。如果所在的用戶是root用戶apt-get update apt-get install-y ubuntu-desktop systemctlset-defaultgraphical.target reboot如果所在的用戶是普通用戶sudo apt-get update sudo apt-get install-y ubuntu-desktop sudo systemctlset-defaultgraphical.target sudo reboot輸入完rebboot后重啟云服務(wù)器會進入下面的界面。選擇hadoop用戶輸入密碼進入。圖形界面設(shè)置為中文如果是第一次安裝會進入英文的界面在英文界面找到終端。虛擬機桌面右鍵找到該位置打開終端。在hadoop用戶下安裝中文語言包sudo apt-get install language-pack-zh-hans還需將系統(tǒng)的默認語言設(shè)置為中文sudoupdate-localeLANGzh_CN.UTF-8重新啟動云服務(wù)器reboot再重啟后點擊下圖紅框位置下滑找到區(qū)域與語言如果上述設(shè)置無效在英文界面找到該選項。點擊語言進行選擇如果在上述選項中未看見中文選項則點擊已安裝的語言。在這窗口中可以點擊添加或刪除語言在里面找到chinese安裝簡體語言之后點再選擇中文點擊應(yīng)用到整個系統(tǒng)即可或者再次重啟云服務(wù)器即可。完成了云服務(wù)器的中文設(shè)定。圖形界面的取消在桌面上右鍵之后打開終端sudo systemctlset-defaultmulti-user.target sudo reboot進行圖形話的取消。徹底刪除sudo apt-get purge ubuntu-desktop unity gnome-shell lightdm sudo apt-get autoremove sudo rebooteclipse調(diào)試java程序前面已經(jīng)完成了 Hadoop 的安裝、HDFS 的 Shell 操作以及 Eclipse 的安裝與圖形界面配置。本節(jié)將在 Eclipse 中編寫一個 Java 程序直接通過 HDFS Java API 讀取 HDFS 上的文件并輸出內(nèi)容同時說明運行結(jié)果與常見報錯的排查方法。1. 新建 Java 項目打開 Eclipse依次點擊File - New - Java Project在彈出的窗口中填寫項目名稱例如HDFSDemoJRE 選擇本機已安裝的 JDK建議 JDK 8 及以上點擊Finish完成創(chuàng)建。如果 Eclipse 提示需要配置 JRE可在Window - Preferences - Java - Installed JREs中添加本機的 JDK 路徑例如/usr/lib/jvm/java-8-openjdk-amd64。項目創(chuàng)建完成后在src目錄上右鍵選擇New - Class填寫包名com.hadoop.demo、類名HDFSReadDemo勾選public static void main(String[] args)點擊Finish。2. 導(dǎo)入 Hadoop 相關(guān) jar 包Hadoop 的 Java 依賴都在 Hadoop 安裝目錄的share/hadoop下。最省事的做法是把相關(guān)目錄下的 jar 包全部導(dǎo)入項目在項目名HDFSDemo上右鍵選擇Build Path - Configure Build Path切換到Libraries標簽頁點擊Add External JARs然后依次進入 Hadoop 安裝目錄本教程為/usr/local/hadoop把以下目錄中的 jar 包全部選中導(dǎo)入/usr/local/hadoop/share/hadoop/common及其lib子目錄/usr/local/hadoop/share/hadoop/hdfs及其lib子目錄/usr/local/hadoop/share/hadoop/yarn及其lib子目錄/usr/local/hadoop/share/hadoop/mapreduce及其lib子目錄也可以在終端中用一條命令把所需 jar 包復(fù)制到一個統(tǒng)一目錄再整體導(dǎo)入mkdir-p/home/hadoop/hadoop-libs find/usr/local/hadoop/share/hadoop-name*.jar-execcp{}/home/hadoop/hadoop-libs/ \;然后在Add External JARs中一次性選中/home/hadoop/hadoop-libs下的所有 jar 包即可。3. 編寫讀取 HDFS 文件的 Java 示例在HDFSReadDemo.java中寫入如下代碼實現(xiàn)讀取 HDFS 上/user/hadoop/input/myLocalFile.txt文件并打印內(nèi)容packagecom.hadoop.demo;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.net.URI;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FSDataInputStream;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;publicclassHDFSReadDemo{publicstaticvoidmain(String[]args){StringhdfsUrihdfs://localhost:9000;StringfilePath/user/hadoop/input/myLocalFile.txt;ConfigurationconfnewConfiguration();conf.set(fs.defaultFS,hdfsUri);FileSystemfsnull;FSDataInputStreaminnull;BufferedReaderreadernull;try{// 獲取 HDFS 文件系統(tǒng)實例fsFileSystem.get(newURI(hdfsUri),conf,hadoop);PathpathnewPath(filePath);if(!fs.exists(path)){System.out.println(文件不存在filePath);return;}infs.open(path);readernewBufferedReader(newInputStreamReader(in,UTF-8));System.out.println( 開始讀取 filePath );Stringline;while((linereader.readLine())!null){System.out.println(line);}System.out.println( 讀取結(jié)束 );}catch(Exceptione){e.printStackTrace();}finally{try{if(reader!null)reader.close();if(in!null)in.close();if(fs!null)fs.close();}catch(Exceptione){e.printStackTrace();}}}}說明幾點hdfs://localhost:9000中的端口要與core-site.xml中fs.defaultFS的配置保持一致若配置的是hdfs://localhost:8020這里也要改成8020。FileSystem.get(new URI(hdfsUri), conf, hadoop)中的hadoop是運行 HDFS 的用戶名避免出現(xiàn)權(quán)限不足的問題。讀取的文件路徑要與前面通過 Shell 上傳的文件路徑一致即/user/hadoop/input/myLocalFile.txt。4. 運行結(jié)果說明在 Eclipse 中右鍵HDFSReadDemo.java選擇Run As - Java Application控制臺輸出如下 開始讀取/user/hadoop/input/myLocalFile.txt Hadoop Spark XMU DBLAB 讀取結(jié)束 輸出的內(nèi)容與前面通過./bin/hdfs dfs -cat input/myLocalFile.txt查看到的內(nèi)容完全一致說明 Java 程序已經(jīng)成功通過 HDFS API 讀取到了 HDFS 上的文件。5. 常見報錯與排查方法5.1 缺少依賴ClassNotFoundException / NoClassDefFoundError報錯信息類似java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration或java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FileSystem原因Hadoop 的 jar 包沒有正確加入項目的 Build Path。排查方法檢查Build Path - Configure Build Path - Libraries中是否已經(jīng)包含hadoop-common、hadoop-hdfs等 jar 包。確認導(dǎo)入的是share/hadoop下各子目錄及其lib目錄中的 jar 包只導(dǎo)入主 jar 而漏掉lib下的依賴同樣會報錯。修改后重新Clean項目Project - Clean再運行。5.2 連接被拒絕Connection refused報錯信息類似java.net.ConnectException: CallFromxxx to localhost:9000 failed on connection exception: java.net.ConnectException: Connection refused原因HDFS 沒有啟動或者程序中的地址、端口與實際配置不一致。排查方法在終端執(zhí)行jps確認NameNode、DataNode進程存在若沒有執(zhí)行./sbin/start-dfs.sh啟動 Hadoop。查看core-site.xml中fs.defaultFS的值確認代碼中的hdfsUri與之完全一致端口 9000 與 8020 是最常見的差異。如果 Eclipse 運行在云服務(wù)器上確認 HDFS 相關(guān)端口如 9000、9870在安全組中已放行如果 Eclipse 運行在本地而 HDFS 在云服務(wù)器上需要把localhost換成云服務(wù)器的公網(wǎng) IP并確保端口可訪問。5.3 權(quán)限不足Permission denied報錯信息類似org.apache.hadoop.security.AccessControlException: Permission denied: userxxx,accessREAD,inode/user/hadoop/input/myLocalFile.txt原因運行程序的用戶與 HDFS 文件所屬用戶不一致。排查方法在FileSystem.get中顯式指定用戶名如FileSystem.get(new URI(hdfsUri), conf, hadoop)?;蛘咴谶\行配置的VM arguments中加入-DHADOOP_USER_NAMEhadoop。也可以對目標文件執(zhí)行./bin/hdfs dfs -chmod -R 777 /user/hadoop/input放開權(quán)限僅建議在測試環(huán)境使用。5.4 文件不存在FileNotFoundException報錯信息類似java.io.FileNotFoundException: File/user/hadoop/input/myLocalFile.txt does not exist原因讀取的路徑寫錯或文件尚未上傳到 HDFS。排查方法執(zhí)行./bin/hdfs dfs -ls /user/hadoop/input確認文件確實存在。注意 HDFS 路徑是絕對路徑不要寫成相對路徑或本地路徑。若文件不存在先按前面「文件操作」一節(jié)的命令重新上傳。5.5 Windows 下運行報錯Could not locate executable null\bin\winutils.exe原因Hadoop 原生庫在 Windows 下需要winutils.exe支持。排查方法下載與 Hadoop 版本對應(yīng)的winutils.exe和hadoop.dll放到本地 Hadoop 目錄的bin下。配置環(huán)境變量HADOOP_HOME指向該目錄并把%HADOOP_HOME%\bin加入Path。更推薦直接在 Linux 云服務(wù)器的圖形界面中使用 Eclipse可避免此類平臺差異問題。總結(jié)本文圍繞 HDFS 的實踐操作展開形成了一條從命令行到編程接口的完整鏈路。首先通過 Shell 命令與 HDFS 交互熟悉hadoop fs的用法與幫助信息接著在目錄操作中創(chuàng)建用戶目錄、查看與刪除目錄掌握 HDFS 的路徑體系隨后在文件操作中完成本地文件的上傳、查看、下載與 HDFS 內(nèi)部拷貝理解本地文件系統(tǒng)與 HDFS 之間的數(shù)據(jù)流轉(zhuǎn)。在此基礎(chǔ)上安裝 Eclipse 并配置圖形界面與中文環(huán)境為編寫 Java 程序提供可視化開發(fā)環(huán)境最后通過 HDFS Java API 讀取 HDFS 文件并輸出內(nèi)容把前面的 Shell 操作對應(yīng)到代碼實現(xiàn)上。學(xué)習(xí)時應(yīng)重點把握「先 Shell 驗證、再代碼實現(xiàn)」的思路并注意端口配置、依賴導(dǎo)入與權(quán)限設(shè)置這幾個關(guān)鍵銜接點。