HDFS設計的主要目的是對海量數據進行存儲,也就是說在其上能夠存儲很大量文件(可以存儲TB級的文件)。HDFS將這些文件分割之后,存儲在不同的DataNode上, HDFS 提供了兩種訪問接口:Shell接口和Java API 接口,對HDFS里面的文件進行操作,具體每個Block放在哪台DataNode上面,對於開發者來說是透明的。
下面將介紹通過Shell接口對HDFS進行操作,HDFS處理文件的命令和Linux命令基本相同,這里區分大小寫
目錄
下面列舉出幾個常用場景下的命令
- 創建文件夾
HDFS上的文件目錄結構類似Linux,根目錄使用"/"表示。
下面的命令將在/middle(已存在)目錄下建立目錄weibo
[hadoop@ljc hadoop]$ hadoop fs -mkdir /middle/weibo
效果如下:
- 上傳文件weibo.txt到weibo目錄下
[hadoop@ljc ~]$ hadoop fs -put weibo.txt /middle/weibo/
效果如下:
還可以使用 -copyFromLocal參數。
[hadoop@ljc ~]$ hadoop fs -copyFromLocal weibo.txt /middle/weibo/
- 查看weibo.txt文件內容。
[hadoop@ljc ~]$ hadoop fs -text /middle/weibo/weibo.txt
效果如下:
還可以用 -cat、-tail 參數查看文件的內容。但是對於壓縮的結果文件只能用 -text 參數來查看,否則是亂碼。
[hadoop@ljc ~]$ hadoop fs -cat /middle/weibo/weibo.txt
[hadoop@ljc ~]$ hadoop fs -tail /middle/weibo/weibo.txt
- 通過終端向"/middle/weibo/weibo.txt"中輸入內容
[hadoop@ljc ~]$ hadoop fs -appendToFile - /middle/weibo/weibo.txt
如下所示:
退出終端輸入,按Ctrl + C
- 把"/middle/weibo/weibo.txt"復制到"/middle"
[hadoop@ljc ~]$ hadoop fs -cp /middle/weibo/weibo.txt /middle
效果如下:
- 把weibo.txt文件復制到本地。
[hadoop@ljc ~]$ hadoop fs -get /middle/weibo/weibo.txt
效果如下:
還可以用 -copyToLocal 參數。
[hadoop@ljc ~]$ hadoop fs -copyToLocal /middle/weibo/weibo.txt
- 刪除weibo.txt文件。
[hadoop@ljc ~]$ hadoop fs -rm /middle/weibo/weibo.txt
效果如下:
- 刪除/middle/weibo文件夾。
[hadoop@ljc ~]$ hadoop fs -rm -r /middle/weibo
效果如下:
- 顯示 /middle 目錄下的文件。
[hadoop@ljc ~]$ hadoop fs -ls /middle
效果如下:
上面我們介紹的是訪問單個HDFS集群,但是多個Hadoop集群需要復制數據該怎么辦呢?幸運的是,Hadoop 有一個有用的distcp分布式復制程序,該程序是由 MapReduce作業來實現的,它是通過集群中並行運行的map來完成集群之間大量數據的復制。下面我們將介紹 distcp在不同場景下該如何使用
- 兩個集群運行相同版本的Hadoop
確保兩個集群版本相同,這里以hadoop1、hadoop2集群為例,如下所示
1)、兩個 HDFS 集群之間傳輸數據,默認情況下 distcp 會跳過目標路徑下已經存在的文件
[hadoop@hadoop1 ~]$ hadoop distcp /weather hdfs://hadoop2:9000/middle
效果如下:
這條指令是在hadoop1中執行,意思是把/weather目錄及其內容復制到hadoop2集群的/middle目錄下,所以hadoop2集群最后的目錄結構為/middle/weather
如下所示
如果/middle 不存在,則新建一個。也可以指定多個源路徑,並把所有路徑都復制到目標路徑下。
這里的目標路徑(hadoop2)必須是絕對路徑,源路徑(hadoop1)可以是絕對路徑,也可以是相對路徑,因為我是在hadoop1中執行的,且默認是HDFS協議
在執行這條指令時可能會報錯
如下所示
這是因為沒有把hadoop2(hadoop2對應IP:192.168.233.130)追加到/etc/hosts文件中,如下所示
如果指令在hadoop2中執行,可以這樣寫,如下
[hadoop@hadoop2 ~]$ hadoop distcp hdfs://hadoop1:9000/weather /middle
效果如下:
這時,源路徑就必須寫絕對路徑,目錄路徑可以是絕對路徑,也可以是相對路徑,因為我是在hadoop2中執行的,且默認是HDFS協議,如果報錯,請參考上面
2)、兩個 HDFS 集群之間傳輸數據,覆蓋現有的文件使用overwrite
[hadoop@hadoop1 ~]$ hadoop distcp -overwrite /weather hdfs://hadoop2:9000/middle/weather
如下所示
注意,在overwrite時,只是將/weather中的內容覆蓋到"hdfs://hadoop2:9000/middle/weather"中,不包含/weather目錄本身,所以在overwrite時,目錄路徑加上了/weather
3)、兩個 HDFS 集群之間傳輸數據,更新有改動過的文件使用update。
[hadoop@hadoop1 ~]$ hadoop distcp -update /weather hdfs://hadoop2:9000/middle/weather
效果如下:
注意,在update時,只是將/weather中的內容覆蓋到"hdfs://hadoop2:9000/middle/weather"中,不包含/weather目錄本身,所以在update時,目錄路徑加上了/weather
- 兩個集群運行不同版本的Hadoop
不同版本Hadoop集群的RPC是不兼容的,使用distcp復制數據並使用hdfs協議,會導致復制作業失敗。想要彌補這種情況,可以在下面兩種方式選擇一種;下面以hadoop1、hadoop3兩個集群為例,版本如下
1)、基於hftp實現兩個HDFS集群之間傳輸數據
[hadoop@hadoop3 ~]$ hadoop distcp hftp://hadoop1:50070/weather /middle
如下所示
有三點需要說明:
1、這個命令必須運行在目標集群上,進而實現hdfs RPC版本的兼容
2、hftp地址由dfs.http.address屬性決定的,其端口默認值為50070
3、該命令是將hftp://hadoop1:9000/weather中內容傳輸到/middle目錄中,不包含/middle目錄本身
2)、基於webhdfs實現兩個HDFS集群之間傳輸數據
如果使用新出的webhdfs協議(替代 hftp)后,對源集群和目標集群均可以使用 HTTP協議進行通信,且不會造成任何不兼容的問題
[hadoop@hadoop3 ~]$ hadoop distcp webhdfs://hadoop1:50070/weather webhdfs://hadoop3:50070/middle
如下所示
掌握了 shell 如何訪問 HDFS,作為 Hadoop 管理員,還需要掌握如下常見命令
- 查看正在運行的Job。
[hadoop@hadoop1 ~]$ hadoop job –list
如下所示
- 關閉正在運行的Job
[hadoop@hadoop1 ~]$ hadoop job -kill job_1432108212572_0001
如下所示
- 檢查 HDFS 塊狀態,查看是否損壞。
[hadoop@hadoop1 ~]$ hadoop fsck /
- 檢查 HDFS 塊狀態,並刪除損壞的塊。
[hadoop@hadoop1 ~]$ hadoop fsck / -delete
- 檢查 HDFS 狀態,包括 DataNode 信息。
[hadoop@hadoop1 ~]$ hadoop dfsadmin -report
- Hadoop 進入安全模式。
[hadoop@hadoop1 ~]$ hadoop dfsadmin -safemode enter
如下所示
- Hadoop 離開安全模式。
[hadoop@hadoop1 ~]$ hadoop dfsadmin -safemode leave
如下所示
- 平衡集群中的文件
[hadoop@hadoop1 ~]$ /usr/java/hadoop/sbin/start-balancer.sh
start-balancer.sh命令位於hadoop安裝路徑下的/sbin下
如下所示
文檔鏈接:下載
如果,您認為閱讀這篇博客讓您有些收獲,不妨點擊一下右下角的【推薦】。
如果,您希望更容易地發現我的新博客,不妨點擊一下左下角的【關注我】。
如果,您對我的博客所講述的內容有興趣,請繼續關注我的后續博客,我是【劉超★ljc】。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。