1. 程式人生 > >hadoop--02(hdfs詳解)

hadoop--02(hdfs詳解)

1.HDFS的概念和特性

  首先,它是一個檔案系統,用於儲存檔案,通過統一的名稱空間——目錄樹來定位檔案其次,它是分散式的,由很多伺服器聯合起來實現其功能,叢集中的伺服器有各自的角色;

重要特性如下:

  1. HDFS中的檔案在物理上是分塊儲存(block,塊的大小可以通過配置引數( dfs.blocksize)來規定,預設大小在hadoop2.x版本中是128M,老版本中是64M
  2. HDFS檔案系統會給客戶端提供一個統一的抽象目錄樹,客戶端通過路徑來訪問檔案,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
  3. 目錄結構及檔案分塊資訊
    (
    元資料)的管理由namenode節點承擔namenodeHDFS叢集主節點,負責維護整個hdfs檔案系統的目錄樹,以及每一個路徑(檔案)所對應的block塊資訊(blockid,及所在的datanode伺服器)
  4. 檔案的各個block的儲存管理由datanode節點承擔datanodeHDFS叢集從節點,每一個block都可以在多個datanode上儲存多個副本(副本數量也可以通過引數設定dfs.replication
  5. HDFS是設計成適應一次寫入,多次讀出的場景,且不支援檔案的修改

(注:適合用來做資料分析,並不適合用來做網盤應用,因為,不便修改,延遲大,網路開銷大,成本太高

)

 2.常用命令引數介紹

-help            

功能:輸出這個命令引數手冊

-ls                 

功能:顯示目錄資訊

示例: hadoop fs -ls hdfs://hadoop-server01:9000/

備註:這些引數中,所有的hdfs路徑都可以簡寫

-->hadoop fs -ls /   等同於上一條命令的效果

-mkdir             

功能:在hdfs上建立目錄

示例:hadoop fs  -mkdir  -p  /aaa/bbb/cc/dd

-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

 

-cat 

功能:顯示檔案內容 

示例:hadoop fs -cat  /hello.txt

 

-tail                

功能:顯示一個檔案的末尾

示例:hadoop  fs  -tail  /weblog/access_log.1

-text                 

功能:以字元形式列印一個檔案的內容

示例: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

 

-rm               

功能:刪除檔案或資料夾

示例:hadoop fs -rm -r /aaa/bbb/

 

-rmdir                 

功能:刪除空目錄

示例:hadoop  fs  -rmdir   /aaa/bbb/ccc

-df              

功能:統計檔案系統的可用空間資訊

示例:hadoop  fs  -df  -h  /

 

-du

功能:統計資料夾的大小資訊

示例:

hadoop  fs  -du  -s  -h /aaa/*

 

-count        

功能:統計一個指定目錄下的檔案節點數量

示例:hadoop fs -count /aaa/

 

-setrep               

功能:設定hdfs中檔案的副本數量

示例:hadoop fs -setrep 3 /aaa/jdk.tar.gz

<這裡設定的副本數只是記錄在namenode的元資料中,是否真的會有這麼多副本,還得看datanode的數量>

 

 

3.HDFS原理篇

  1. HDFS叢集分為兩大角色:NameNodeDataNode
  2. NameNode負責管理整個檔案系統的元資料
  3. DataNode 負責管理使用者的檔案資料塊
  4. 檔案會按照固定的大小(blocksize)切成若干塊後分布式儲存在若干臺datanode
  5. 每一個檔案塊可以有多個副本,並存放在不同的datanode
  6. Datanode會定期向Namenode彙報自身所儲存的檔案block資訊,而namenode則會負責保持檔案的副本數量
  7. HDFS的內部工作機制對客戶端保持透明,客戶端請求訪問HDFS都是通過向namenode申請來進行

  1.HDFS寫資料流程:
    客戶端要向HDFS寫資料,首先要跟namenode通訊以確認可以寫檔案並獲得接收檔案block的datanode,然後,客戶端按順序將檔案逐個block傳遞給相應datanode,並由接收到block的datanode負責向其他datanode複製block的副本

  

    1、根namenode通訊請求上傳檔案,namenode檢查目標檔案是否已存在,父目錄是否存在

    2namenode返回是否可以上傳

    3client請求第一個 block該傳輸到哪些datanode伺服器上

    4namenode返回3datanode伺服器ABC

    5client請求3dn中的一臺A上傳資料(本質上是一個RPC呼叫,建立pipeline),A收到請求會繼續呼叫B,然後B呼叫C,將真個pipeline建立完成,逐級返回客戶端

   6client開始往A上傳第一個block(先從磁碟讀取資料放到一個本地記憶體快取),以packet為單位,A收到一個packet就會傳給  BB傳給CA每傳一個packet會放入一個應答佇列等待應答

   7、當一個block傳輸完成之後,client再次請求namenode上傳第二個block的伺服器。

 2. HDFS讀資料流程:
     
客戶端將要讀取的檔案路徑傳送給namenode,namenode獲取檔案的元資訊(主要是block的存放位置資訊)返回給客戶端,客戶端根據返回的資訊找到相應datanode逐個獲取檔案的block並在客戶端本地進行資料追加合併從而獲得整個檔案

   

 

    1、跟namenode通訊查詢元資料,找到檔案塊所在的datanode伺服器

    2、挑選一臺datanode(就近原則,然後隨機)伺服器,請求建立socket

    3datanode開始傳送資料(從磁盤裡面讀取資料放入流,以packet為單位來做校驗)

    4、客戶端以packet為單位接收,現在本地快取,然後寫入目標檔案

  3.NAMENODE工作機制:
    
學習目標:理解namenode的工作機制尤其是元資料管理機制,以增強對HDFS工作原理的理解,及培養hadoop叢集運營中“效能調優”、“namenode”故障問題的分析解決能力

   NAMENODE職責:負責客戶端請求的響應。元資料的管理(查詢,修改)

   元資料管理:namenode對資料的管理採用了三種儲存形式:

   記憶體元資料(NameSystem) 元資料存放在記憶體這樣才高效,

   磁碟元資料映象檔案  其次要有備份才安全,所以在namenode節點所對應的磁碟上有相應的備份

   資料操作日誌檔案(可通過日誌運算出元資料) ,但是如果記憶體中一有資料變動就跟新到磁碟效率必然很低,所以需要弄個操作日誌檔案

   元資料儲存機制:

A、記憶體中有一份完整的元資料(記憶體meta data)

B、磁碟有一個“準完整”的元資料映象(fsimage)檔案(namenode的工作目錄中)

C、用於銜接記憶體metadata和持久化元資料映象fsimage之間的操作日誌(edits檔案注:當客戶端對hdfs中的檔案進行新增或者修改操作,操作記錄首先被記入edits日誌檔案中,當客戶端操作成功後,相應的元資料會更新到記憶體meta.data

元資料的checkpoint:每隔一段時間,會由secondary namenodenamenode上積累的所有edits和一個最新的fsimage下載到本地,並載入到記憶體進行merge(這個過程稱為checkpoint),checkpoint的作用:namenodesecondary namenode的工作目錄儲存結構完全相同,所以,當namenode故障退出需要重新恢復時,可以從secondary namenode的工作目錄中將fsimage拷貝到namenode的工作目錄,以恢復namenode的元資料。

4.DATANODE的工作機制:Datanode工作職責:儲存管理使用者的檔案塊資料定期向namenode彙報自身所持有的block資訊(通過心跳資訊上報)這點很重要,因為,當叢集中發生某些block副本失效時,叢集如何恢復block初始副本數量的問題)

5.HDFSjava操作:hdfs在生產應用中主要是客戶端的開發,其核心步驟是從hdfs提供的api中構造一個HDFS的訪問客戶端物件,然後通過該客戶端物件操作(增刪改查)HDFS上的檔案

 具體實現見文件大資料離線計算2

接下來檢視hdfs的目錄樹:首先需要給linux安裝tree命令:

yum install gcc 
yum install gcc-c++ 
# 下載
wget http://mama.indstate.edu/users/ice/tree/src/tree-1.7.0.tgz
tar zxvf tree-1.7.0.tgz 
cd tree-1.7.0
make
cp tree /bin
給linux安裝telnet命令:
Sudo yum install xinetd
yum install telnet
yum install telnet-server

 查詢hdfs下的資料夾hadoop fs –ls /

 建立hdfs下的資料夾  hadoop fs -mkdir /test

 

 問題:沒有找到主機路由:

 防火牆沒有關的原因:
檢視防火牆是否開啟:sudo  service iptables status

關閉防火牆:sudo service iptables stop

刪除檔案系統根目錄下的檔案:

hadoop fs -rmr /a.txt

建立資料夾:

hadoop fs -mkdir -p /aaa/bbb

用tree命令檢視hdfs的樹結構:

檢視檔案的大小:

 案例:沒有name ,嘗試從SecondaryNameNode恢復資料

 把name幹掉:rm –rf name

再把namenode的程序殺掉:

Hadoop不能運行了:

嘗試恢復:SecondaryNameNode裡面有的才能恢復,沒有就不能恢復

更安全的做法是讓edits操作日誌寫到多個磁碟上去 namenode的工作目錄

配置檔案:

檢視叢集的狀態:

hdfs dfsadmin –report