1. 程式人生 > >二、HDFS檔案系統

二、HDFS檔案系統

HDFS檔案系統的組成

  • NameNode 負責管理整個檔案系統的元資料,以及每一個路徑(檔案)所對應的資料塊資訊。
  • DataNode 負責管理使用者的檔案資料塊,每一個數據塊都可以在多個datanode上儲存多個副本。
  • Secondary NameNode 用來監控HDFS狀態的輔助後臺程式,每隔一段時間獲取HDFS元資料的快照。

HDFS寫資料流程

image

  • 1)客戶端向namenode請求上傳檔案,namenode檢查目標檔案是否已存在,父目錄是否存在。
  • 2)namenode返回是否可以上傳。
  • 3)客戶端請求第一個 block上傳到哪幾個datanode伺服器上。
  • 4)namenode返回3個datanode節點,分別為dn1、dn2、dn3。
  • 5)客戶端請求dn1上傳資料,dn1收到請求會繼續呼叫dn2,然後dn2呼叫dn3,將這個通訊管道建立完成
  • 6)dn1、dn2、dn3逐級應答客戶端
  • 7)客戶端開始往dn1上傳第一個block(先從磁碟讀取資料放到一個本地記憶體快取),以packet為單位,dn1收到一個packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個應答佇列等待應答
  • 8)當一個block傳輸完成之後,客戶端再次請求namenode上傳第二個block的伺服器。(重複執行3-7步)

HDFS讀資料流程

image

  • 1)客戶端向namenode請求下載檔案,namenode通過查詢元資料,找到檔案塊所在的datanode地址。
  • 2)挑選一臺datanode(就近原則,然後隨機)伺服器,請求讀取資料。
  • 3)datanode開始傳輸資料給客戶端(從磁盤裡面讀取資料放入流,以packet為單位來做校驗)。
  • 4)客戶端以packet為單位接收,先在本地快取,然後合併寫入目標檔案。

機架感知

  • 第一個副本在client所處的節點上。如果客戶端在叢集外,隨機選一個。
  • 第二個副本和第一個副本位於相同機架,隨機節點。
  • 第三個副本位於不同機架,隨機節點。

HDFS Shell命令

#列出HDFS下的檔案
$ hadoop fs -ls /

#遞迴列出HDFS下的檔案
$ hadoop fs -ls -R /user

#上傳資料夾到HDFS
$ hadoop fs -put wordcount/ /user/hadoop/test
$ hadoop fs -put ./wordcount/ /user/hadoop/test

#上傳多個檔案到HDFS
$ hadoop fs -put LICENSE.txt NOTICE.txt README.txt /wordcount/in
$ hadoop fs -put wc.input tt.input /user/hadoop/test

#將HDFS的檔案下載到本地
$ hadoop fs -get /wordcount/test1.txt .
$ hadoop fs -get /wordcount/test2.txt

#刪除HDFS下的資料夾
$ hadoop fs -rm -r /wordcount
$ hadoop fs -rm -R /user/hadoop/test/wcinput

#檢視HDFS下某個檔案的內容
$ hadoop fs -cat /wordcount/test1.txt

#在HDFS下遞迴建立資料夾
$ hadoop fs -mkdir -p /a/b/c
$ hadoop fs -mkdir -p /user/hadoop/test

#檢視HDFS基本統計資訊
$ hdfs dfsadmin -report

常用命令引數介紹

-moveFromLocal            
功能:從本地剪下貼上到hdfs
示例:hadoop  fs  -moveFromLocal  /home/hadoop/a.txt  /aaa/bbb/cc/dd

-moveToLocal              
功能:從hdfs剪下貼上到本地
示例:hadoop  fs  -moveToLocal   /aaa/bbb/cc/dd  /home/hadoop/a.txt 

-appendToFile  
功能:追加一個檔案到已經存在的檔案末尾
示例:hadoop  fs  -appendToFile  ./hello.txt  hdfs://hadoop-server01:9000/hello.txt
可以簡寫為:Hadoop  fs  -appendToFile  ./hello.txt  /hello.txt

-tail                 
功能:顯示一個檔案的末尾
示例:hadoop  fs  -tail  /weblog/access_log.1

-text                  
功能:以字元形式列印一個檔案的內容(類似-cat)
示例:hadoop  fs  -text  /weblog/access_log.1

-chgrp 
-chmod
-chown
功能:linux檔案系統中的用法一樣,對檔案所屬許可權
示例:
hadoop  fs  -chmod  666  /hello.txt
hadoop  fs  -chown  someuser:somegrp   /hello.txt

-copyFromLocal    
功能:從本地檔案系統中拷貝檔案到hdfs路徑去
示例:hadoop  fs  -copyFromLocal  ./jdk.tar.gz  /aaa/

-copyToLocal      
功能:從hdfs拷貝到本地
示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz

-cp              
功能:從hdfs的一個路徑拷貝hdfs的另一個路徑
示例: hadoop  fs  -cp  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2

-mv                     
功能:在hdfs目錄中移動檔案
示例: hadoop  fs  -mv  /aaa/jdk.tar.gz  /

-get              
功能:等同於copyToLocal,就是從hdfs下載檔案到本地
示例:hadoop fs -get  /aaa/jdk.tar.gz

-getmerge             
功能:合併下載多個檔案
示例:比如hdfs的目錄 /aaa/下有多個檔案:log.1, log.2,log.3,...
hadoop fs -getmerge /aaa/log.* ./log.sum

-put                
功能:等同於copyFromLocal
示例:hadoop  fs  -put  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2

-df               
功能:統計檔案系統的可用空間資訊
示例:hadoop  fs  -df  -h  /

-du 
功能:統計資料夾的大小資訊
示例:hadoop  fs  -du  -s  -h /aaa/*
$ hadoop fs -du -s -h hdfs://cmaster0:9000/*

-count         
功能:統計一個指定目錄下的檔案節點數量
示例:hadoop fs -count /aaa/

-setrep                
功能:設定hdfs中檔案的副本數量
示例:hadoop fs -setrep 3 /aaa/jdk.tar.gz
<這裡設定的副本數只是記錄在namenode的元資料中,是否真的會有這麼多副本,還得看datanode的數量>