HDFS(Hadoop Distributed File System) Hadoop分佈式文件系統

簡介:

    HDFS(Hadoop Distributed File System )Hadoop分佈式文件系統。
    是根據google發表的論文翻版的。論文爲GFS(Google File System)Google 文件系統。

HDFS有很多特點:

     ①保存多個副本,且提供容錯機制,副本丟失或宕機自動恢復。默認存3份。
     ②運行在廉價的機器上
     ③適合大數據的處理。多大,多小?HDFS默認會將文件分割成block,64M爲一個block。
        然後將block按鍵值對存儲在HDFS上並將鍵值對的映射存到內存中(namenode)。

        如果小文件太多,那內存的負擔會很重。


        如上圖所示,HDFS也是按照Master和Slaver的結構。分NameNode、SecondaryNameNode、

DataNode這幾個角色;

NameNode:是Master節點,是管理者,管理數據塊映射;處理客戶端的讀寫請求;配置副本策略;管理HDFS的名

    稱空間:

  • NameNode保存的metadata包括:
  1. 文件ownership和permission
  2. 文件包含了block信息
  3. Block保存在那些DataNode節點上(這部分數據並非保存在NameNode磁盤上的,它在DataNode啓動時報告給NameNode的,Name接收到之後將這些信息保存在內存中)
  4. NameNode的metadata信息在NameNode啓動後加載到內存中
  5. Metadata存儲到磁盤上的文件名稱爲fsimage
  6. Block的位置信息不會保存在fsimage中
  7. Edits文件記錄了客戶端操作fsimage的日誌,對文件的增刪改等。
  8. 用戶對fsimage的操作不會直接更新到fsimage中去,俄日是記錄在edits中

SecondaryNameNode :分擔namenode的工作量;是NameNode的冷備份;合併fsimage和fsedits然後再發給namenode。

  • 合併fsimage和edtis文件,然後發送並替換NameNode的fsimage文件,同時自己留下一個副本。這個副本可提供NameNode毀壞之後的部分文件回覆。
  1. 可以通過fs.checkpoint.period修改合併時間,默認1小時。
  2. 也可以通過配置edits日誌文件大小,fs.checkpoint.size規定edits文件的最大值,來讓SecondaryNameNode來知道什麼時候該進行合併操作了。默認是64M

合併過程如下:


DataNode:Slaver節點,奴隸,幹活的。負責存儲client發來的數據塊block;執行數據塊的讀寫操作。

熱備份b是a的熱備份,如果a壞掉。那麼b馬上運行代替a工作。

冷備份ba的冷備份,如果a壞掉。那麼b不能馬上代替a工作。但是b上存儲a的一些信息,減少a壞掉之後的損失。

fsimage元數據鏡像文件(文件系統的目錄樹。)

edits:元數據的操作日誌(針對文件系統做的修改操作記錄)

namenode內存中存儲的是=fsimage+edits

ScondaryNameNode負責定時默認1小時,從namenode上,獲取fsimageedits來進行合併,然後再發送給namenode。減少namenode的工作量e

HDFS優點:

  • 高容錯性
  1. 數據自動保存多個副本。
  2. 副本丟失後,自動恢復。
  • 適合批量處理
  1. 移動計算的操作
  2. 數據位置暴露給計算框架
  • 適合大數據處理
  1. GB、TB、PB甚至更大
  2. 百萬規模以上的文章數量
  3. 10k+節點可以建在廉價機器上
  4. 通過副本提高可靠性
  5. 提供了容錯和恢復機制

HDFS缺點:

  1. 低延遲數據訪問
  2. 毫秒級讀取
  3. 低延遲與高吞吐量
  4. 小文件存取
  5. 佔用NameNode
  6. 尋址時間超過讀取時間
  7. 併發寫入,文件隨即修改
  8. 一個文件同時只能有一個寫入者
  9. 僅支持append

工作原理:

  • 寫操作:



  1. 有一個文件FileA100M大小。ClientFileA寫入到HDFS上。
  2. HDFS按默認配置。
  3. HDFS分佈在三個機架上Rack1Rack2Rack3

    a. ClientFileA64M分塊。分成兩塊,block1Block2;

    b. ClientnameNode發送寫數據請求,如圖藍色虛線------>

    c. NameNode節點,記錄block信息。並返回可用的DataNode,如粉色虛線--------->

        Block1: host2,host1,host3

        Block2: host7,host8,host4

         原理:

  1. NameNode具有RackAware機架感知功能,這個可以配置。
  2. clientDataNode節點,那存儲block時,規則爲:副本1,同client的節點上;副本2,不同機架節點上;副本3,同第二個副本機架的另一個節點上;其他副本隨機挑選。
  3. client不爲DataNode節點,那存儲block時,規則爲:副本1,隨機選擇一個節點上;副本2,不同副本1,機架上;副本3,同副本2相同的另一個節點上;其他副本隨機挑選。

       d. clientDataNode發送block1;發送過程是以流式寫入。

 流式寫入過程:

  1. 64Mblock164kpackage劃分;
  2. 然後將第一個package發送給host2;
  3. host2接收完後,將第一個package發送給host1,同時clienthost2發送第二個package
  4. host1接收完第一個package後,發送給host3,同時接收host2發來的第二個package
  5. 以此類推,如圖紅線實線所示,直到將block1發送完畢。
  6. host2,host1,host3NameNodehost2Client發送通知,說消息發送完了。如圖粉紅顏色實線所示。
  7. client收到host2發來的消息後,向namenode發送消息,說我寫完了。這樣就真完成了。如圖黃色粗實線。
  8. 發送完block1後,再向host7host8host4發送block2,如圖藍色實線所示。
  9. 發送完block2後,host7,host8,host4NameNodehost7Client發送通知,如圖淺綠色實線所示。
  10. clientNameNode發送消息,說我寫完了,如圖黃色粗實線。。。這樣就完畢了。

分析:

  • 通過寫過程,我們可以瞭解到:
  1. 1T文件,我們需要3T的存儲,3T的網絡流量帶寬
  2. 在執行讀或寫的過程中,NameNodeDataNode通過HeartBeat進行保存通信,確定DataNode活着。如果發現DataNode死掉了,就將死掉的DataNode上的數據,放到其他節點去。讀取時,要讀其他節點去。
  3. 掛掉一個節點,沒關係,還有其他節點可以備份;甚至,掛掉某一個機架,也沒關係;其他機架上,也有備份。
  • 讀操作:



讀操作就簡單一些了,如圖所示,client要從datanode上,讀取FileA。而FileAblock1block2組成。 

  • 讀操作流程爲:

          a. clientnamenode發送讀請求。

          b. namenode查看Metadata信息,返回fileAblock的位置。

                   block1:host2,host1,host3

                   block2:host7,host8,host4

          c. block的位置是有先後順序的,先讀block1,再讀block2。而且block1host2上讀取;然後block2,去host7上讀取;

         上面例子中,client位於機架外,那麼如果client位於機架內某個DataNode上,例如,clienthost6。那麼讀取的時候,遵循的規律是:

  優選讀取本機架上的數據

HDFS文件權限:

  • 與Linux文件權限類似
  1. r:readw:writexexecute
  2. 如果Linux系統用用戶xxx使用hadoop命令創建一個文件,那麼,在hdfs中這個文件的owner就是xxx
  3. HDFS的權限目的是將控制權交出去,本身只判斷用戶和權限,至於用戶是不是真的,不管。

HDFS安全模式:

  1. NameNode啓動的時候,首先講fsimage載入內存,然後按照fsedits中的各項操作修改內存中的fsimage
  2. 當元數據文件在內存中創建完成之後,在NameNode上創建一個新的fsimage替換原fsimage,同時創建一個空的fsedits文件(無需SecodaryNameNode參與)這時,NameNode是運行在安全模式的。即對外(客戶端)只讀,所以此段時間內對hdfs的寫入、刪除、重命名都會失敗。
  3. 然後NameNode收集各個DataNode的報告,當block達到最小副本數以上時,會被認爲“安全”的了,在一定比例的數據塊被確定爲“安全”後,再過若干事件後,安全模式結束。
  4. 當檢測到副本數不足的數據塊時,該塊會被複制,直到達到最小副本數。
  5. Hdfs中數據塊的位置並不是由namenode維護的,而是以塊列表的形式存儲在datanode中的。

HDFS中常用到的命令:

  • hdfs fs:
  1. hdfs fs -ls /
  2. hdfs fs -lsr
  3. hdfs fs -mkdir /user/hadoop
  4. hdfs fs -put a.txt /user/hadoop/
  5. hdfs fs -get /user/hadoop/a.txt /
  6. hdfs fs -cp src dst
  7. hdfs fs -mv src dst
  8. hdfs fs -cat /user/hadoop/a.txt
  9. hdfs fs -rm /user/hadoop/a.txt
  10. hdfs fs -rmr /user/hadoop/a.txt
  11. hdfs fs -text /user/hadoop/a.txt
  12. hdfs fs -copyFromLocal localsrc dst 與 hadoop fs -put 功能類似
  13. hdfs fs -moveFromLocal localsrc dst 將本地文件上傳到hdfs,同時刪除本地文件。
  • hdfs dfsadmin
  1. hdfs dfsasmin -report
  2. hdfs dfsadmin -safemode enter | leave | get | wait
  3. hdfs dfsadmin -setBalancerBandwidth 1000
  • hdfs fsck
  • start-balancer.sh

負載均衡,可以使用DataNote節點上選擇策略重新平衡DataNode上的數據塊的分佈。







發佈了22 篇原創文章 · 獲贊 7 · 訪問量 5737
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章