熟練掌握HDFS的Shell訪問


  HDFS設計的主要目的是對海量數據進行存儲,也就是說在其上能夠存儲很大量文件(可以存儲TB級的文件)。HDFS將這些文件分割之后,存儲在不同的DataNode上, HDFS 提供了兩種訪問接口:Shell接口和Java API 接口,對HDFS里面的文件進行操作,具體每個Block放在哪台DataNode上面,對於開發者來說是透明的。

  下面將介紹通過Shell接口對HDFS進行操作,HDFS處理文件的命令和Linux命令基本相同,這里區分大小寫

目錄

  1、shell操作單個HDFS集群

  2、shell操作多個HDFS集群

  3、hadoop管理員其他常見shel操作

 

1、shell 操作單個HDFS集群

  下面列舉出幾個常用場景下的命令

  • 創建文件夾

  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

  效果如下:

  

2、shell 操作多個 HDFS 集群

  上面我們介紹的是訪問單個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

    如下所示

    

3、Hadoop管理員其他常見shell操作

  掌握了 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】。

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM