熟練掌握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下

  如下所示

  這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章