- 大數據基礎與應用
- 趙國生 王健 宋一兵主編
- 3368字
- 2021-12-15 16:00:31
3.5 HDFS應用實踐
本節介紹關于HDFS文件操作的常用Shell命令,利用Web界面查看和管理Hadoop文件系統,以及利用Hadoop提供的Java API進行基本的文件操作。
3.5.1 HDFS常用命令
HDFS文件的相關操作主要使用hadoop fs、hadoop dfs、hdfs dfs命令,以下對最常用的相關命令進行簡要說明。
(1)ls命令

列出HDFS根目錄下的目錄和文件。

列出HDFS所有的目錄和文件。
(2)put命令

hdfs file的父目錄一定要存在,否則命令不會執行。

hdfs dir一定要存在,否則命令不會執行。

從鍵盤讀取輸入到hdfs file中,按〈Ctrl+D〉鍵結束輸入,hdfs file不能存在,否則命令不會執行。
(3)moveFromLocal命令

與put相類似,命令執行后源文件local src被刪除,也可以從鍵盤讀取輸入到hdfs file中。
(4)copyFromLocal命令

與put相類似,也可以從鍵盤讀取輸入到hdfs file中。
(5)get命令

local file和hdfs file名字不能相同,否則會提示文件已存在,沒有重名的文件會復制到本地。

復制多個文件或目錄到本地時,本地為文件夾路徑,如果用戶不是root,local路徑為用戶文件夾下的路徑,否則會出現權限問題。
(6)copyToLocal命令

與get相類似。
(7)rm命令

每次可以刪除多個文件或目錄。
(8)mkdir命令

只能一級一級地創建目錄,父目錄不存在的話使用這個命令會報錯。

所創建的目錄中,如果父目錄不存在就創建該父目錄。
(9)getmerge命令

將hdfs指定目錄下所有文件排序后合并到local指定的文件中,文件不存在時會自動創建,文件存在時會覆蓋里面的內容。

加上nl后,合并到local file中的hdfs文件之間會空出一行。
(10)cp命令

目標文件不能存在,否則命令不能執行,相當于給文件重命名并保存,源文件還存在。

目標文件夾要存在,否則命令不能執行。
(11)mv命令

目標文件不能存在,否則命令不能執行,相當于給文件重命名并保存,源文件不存在。

源路徑有多個時,目標路徑必須為目錄,且必須存在,跨文件系統的移動(local到hdfs,或者反過來)都是不允許的。
(12)count命令

統計hdfs對應路徑下的目錄個數、文件個數、文件總計大小,顯示為目錄個數、文件個數、文件總計大小,輸入路徑。
(13)du命令

顯示hdfs對應路徑下每個文件夾和文件的大小。

顯示hdfs對應路徑下所有文件的大小。

顯示hdfs對應路徑下每個文件夾和文件的大小,文件的大小用方便閱讀的形式表示,例如用64M代替67108864。
(14)text命令

將文本文件或某些格式的非文本文件通過文本格式輸出。
(15)setrep命令

改變一個文件在hdfs中的副本個數,上述命令中數字3為所設置的副本個數,-R選項可以對一個目錄下的所有目錄和文件遞歸執行改變副本個數的操作。
(16)stat命令

返回對應路徑的狀態信息。[format]可選參數有:%b(文件大小),%o(block大小),%n(文件名),%r(副本個數),%y(最后一次修改日期和時間)。
注意:可以這樣書寫hadoop fs-stat%b%o%n<hdfs path>,不過不建議,這樣每個字符輸出的結果不太容易分清楚。
(17)tail命令

在標準輸出中顯示文件末尾的1KB數據。
(18)archive命令

命令中參數name:壓縮文件名,自己任意取;< hdfs parent dir >:壓縮文件所在的父目錄;< src >:要壓縮的文件名;< hdfs dst >:壓縮文件存放路徑。
示例:hadoop archive-archiveName hadoop.har-p/user 1.txt 2.txt/des。示例中將hdfs中/user目錄下的文件1.txt,2.txt壓縮成一個名叫hadoop.har的文件存放在hdfs中/des目錄下,如果1.txt,2.txt不寫就是將/user目錄下所有的目錄和文件壓縮成一個名叫hadoop.har的文件存放在hdfs中/des目錄下。
顯示jar的內容可以用如下命令:

顯示har壓縮的是哪些文件可以用如下命令:

注意:har文件不能進行二次壓縮。如果想給.har加文件,只能找到原來的文件,重新創建一個。har文件中原來文件的數據并沒有變化,har文件真正的作用是減少NameNode和DataNode過多的空間浪費。
(19)balancer命令

如果管理員發現某些DataNode保存數據過多,某些DataNode保存數據相對較少,可以使用上述命令手動啟動內部的均衡過程。
(20)dfsadmin命令

管理員可以通過dfsadmin管理HDFS,通過上述命令可以查看。

顯示文件系統的基本數據。

enter:進入安全模式;leave:離開安全模式;get:獲知是否開啟安全模式;wait:等待離開安全模式。
3.5.2 HDFS的Web界面
1.啟動順序
(1)啟動Hadoop
執行bin/start-dfs.sh(注意:第一次啟動Hadoop之前必須namenode-format),啟動完成后,使用jps命令查看。
master上有兩個進程:namenode和secondarynamenode。
slave上有一個進程:datanode。如圖3-25所示。

圖3-25 DatoNode進程
(2)啟動yarn
執行bin/start-yarn.sh,啟動完成后,使用jps命令查看。
master上又啟動了一個新進程:resourcemanager。
slave上又啟動了一個新進程:nodemanager。如圖3-26所示。

圖3-26 nodemanager進程
(3)啟動ZooKeeper
執行bin/zkServer.sh start(master和slave上都要啟動,第一步和第二步只在master上啟動即可),啟動完成后,使用jps命令查看。
master和slave上又多了一個新進程:quorunpeermain。
(4)啟動HBase
bin/start-hbase.sh,啟動完成后,使用jps命令查看。
master上多了一個進程:HMaster。
slave上多了一個進程:HRegionserver。
至此,啟動完成,可以進入Hbase shell,進行建表、添加數據等操作。
2.使用Web查看Hadoop的運行狀態
(1)查看HDFS集群狀態
訪問如下地址:http://198.199.89.85:50070,界面如圖3-27所示。

圖3-27 查看HDFS集群狀態
(2)查看Web控制臺狀態
訪向如下地址:http://master:8088(yarn.resourcemanager.webapp.address)。
(3)查看HBase的狀態
訪向如下地址:http://localhost:60010。對于Hadoop2.2.0,只發現了上述兩個Web地址,可能還有其他的,Hadoop1.x和Hadoop0.20.x的Web地址對應的端口可能不太一樣,也可能和配置文件有關,了解完Hadoop,下面從視覺上看看Hadoop如何使用,如圖3-28所示。

圖3-28 實際運行
可以在Windows 7系統上,通過Web界面在瀏覽器地址欄輸入地址198.199.89.85:50070,直接查看Hadoop的運行情況。由此可以看到Map/Reduce的管理情況,如圖3-29~圖3-31所示。

圖3-29 Node of the cluster界面

圖3-30 Accepted Applications界面

圖3-31 Scheduler界面
3.5.3 HDFS常用Java API及應用實例
打開Eclipse,開始創建項目,選擇頂部菜單File→New→Java Project,創建名為HadoopTest的項目,如圖3-32所示。

圖3-32 創建Hadoop Test項目
為項目加載所需要的jar包。首先獲取jar包,Java API所在的jar包都在已經安裝好的Hadoop文件夾中,路徑為:<hadoop_home>/share/hadoop。本項目所需的Hadoop jar包主要有hadoop-common-2.9.0.jar和hadoop-hdfs-2.9.0.jar。
加載jar包的具體操作為:右擊所選的Eclipse項目→在彈出菜單中選擇Properties→Java Build Path→Libraries→Add Externall JARS。另外,為了避免報“ClassNotFound”異常,還需要向項目中加入Hadoop API所依賴的第三方包,這些包在<hadoop_home>/share/hadoop/common/lib/文件夾下,將該lib文件整個復制到項目根目錄下,并在Eclipse中刷新項目,選中lib下的所有jar包,右擊選擇Build Path→Add to Build Path,如圖3-33所示。

圖3-33 路徑選擇
編寫一個簡單的程序來測試偽分布文件系統HDFS上是否存在test.txt文件。

直接運行會報以下錯誤。

該錯誤的解決方法是將<hadoop_home>/etc/hadoop/文件夾下的core-site.xml文件和hdfs-site.xml文件復制到項目的src/目錄下。
再運行還會報以下錯誤。

需要添加hadoop-hdfs-client-2.9.0.jar包到Build Path下。
運行成功后結果如圖3-34所示。

圖3-34 添加hadoop-hdfs-client-2.9.0.jar包
【實例一】:使用java.net.URL訪問HDFS。
操作:顯示HDFS文件夾中的文件內容。
● 使用java.net.URL對象打開數據流。
● 使用靜態代碼塊使得Java程序識別Hadoop的HDFS url。
操作代碼如下:

1)在指定文件夾下創建示例文件demo,如圖3-35所示。


圖3-35 創建demo文件
2)上傳文件至HDFS的data目錄,需要首先創建data目錄,如圖3-36所示。


圖3-36 創建data目錄
3)查看是否上傳成功,如圖3-37所示。


圖3-37 查看上傳結果
4)將已經打包好的jar文件上傳至Linux并切換到相應文件夾運行Hadoop命令執行,從結果可以看出demo文件的內容,如圖3-38所示。


圖3-38 demo文件內容
【實例二】:使用FileSystem訪問HDFS。
操作:將本地文件系統的文件通過java-API寫入到HDFS文件。
1)本地文件系統和HDFS中應該首先創建指定的目錄。
Linux中創建文件命令:mkdir test。
HDFS中創建文件夾命令:hadoop dfs-mkdir /data/。

2)程序源代碼如下。


3)程序打包并傳至Linux文件系統中,請參考實例一的打包過程。
4)程序運行及結果分析。
①查看指定jar包是否成功上傳,在Linux中使用ls或ll命令。
②執行jar命令,運行結果如圖3-39所示。


圖3-39 程序運行結果
③結果顯示“welcome to....”說明操作正確回到導航。
【實例三】:創建HDFS目錄。
操作:HDFS創建test2目錄。
1)明確在HDFS中創建目錄的具體地址,在程序中通過args[0]參數提供用戶輸入,例如:

2)程序源代碼如下。


3)將jar包上傳到Linux,請參考第一個程序的導出jar包的過程。
4)程序運行及結果分析如圖3-40所示。


圖3-40 test 2目錄創建
【實例四】:刪除HDFS目錄。
源代碼如下:


將jar包上傳到Linux(請參考第一個程序的導出jar包的過程)。
程序運行及結果分析:執行程序之后,通過hadoop dfs-ls/查看是否成功刪除HDFS上面的文件。
【實例五】:查看文件或目錄是否存在。
源代碼如下:

將jar包上傳到Linux(請參考第一個程序的導出jar包的過程)。
程序運行及結果分析:如果在Linux中存在該文件的話,則顯示“指定文件或目錄Exists”。
【實例六】:列出目錄下的文件或目錄名稱。
源代碼如下:

將jar包上傳到Linux(請參考第一個程序的導出jar包的過程)。程序運行及結果分析如圖3-41所示。

圖3-41 運行結果
【實例七】:查看文件存儲位置。
源代碼如下:


將jar包上傳到Linux(請參考第一個程序的導出jar包的過程)。
程序運行及結果分析:由于采用偽分布的環境block塊存儲均為1,因此這里僅顯示1個block塊的host主機名,顯示“block_0_Location:neusoft-master”。
【實例八】:將本地文件寫入到HDFS中。
源代碼如下:


將jar包上傳到Linux(請參考第一個程序的導出jar包的過程)。
程序運行及結果分析:將本地的demo文件寫入HDFS的data目錄下的test文件。