二、HDFS檔案系統
阿新 • • 發佈:2018-12-27
HDFS檔案系統的組成
- NameNode 負責管理整個檔案系統的元資料,以及每一個路徑(檔案)所對應的資料塊資訊。
- DataNode 負責管理使用者的檔案資料塊,每一個數據塊都可以在多個datanode上儲存多個副本。
- Secondary NameNode 用來監控HDFS狀態的輔助後臺程式,每隔一段時間獲取HDFS元資料的快照。
HDFS寫資料流程
- 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讀資料流程
- 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的數量>