HDFS基本原理

HDFS(Hadoop Distributed File System )Hadoop分佈式文件系統,是Google 文件系統GFS(Google File System)的開源實現。

HDFS有很多特點:

  1. 簡單的文件模型。
  2. 兼容廉價的硬件設備。
  3. 適合大數據處理。
  4. 數據流讀寫。
  5. 強大的跨平臺兼容性。

在實現上述特點的同時,也使得自身具有一些應用侷限性,主要包括;

  1. 不適合低延遲數據訪問。
  2. 無法高效存儲大量小文件。
  3. 不支持多用戶寫入及任意修改文件。

體系結構

這裏寫圖片描述
如上圖所示,HDFS也是按照Master和Slave的結構。分NameNode、SecondaryNameNode、DataNode這幾個角色。

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

SecondaryNameNode:是一個小弟,分擔大哥Namenode的工作量;是NameNode的冷備份;合併fsimage和fsedits然後再發給namenode。

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

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

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

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

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

NameNode內存中存儲的是=FsImage+EditLog。
SecondaryNameNode負責定時(默認1小時)從NameNode上,獲取FsImage和EditLog來進行合併,然後再發送給namenode。能有效解決Editlog逐漸變大帶來的問題。另外,可作爲名稱節點的“檢查點”,週期性地備份名稱節點中的元數據信息,當名稱節點發生故障時,就可以用第二名稱節點中記錄的元數據信息來進行系統恢復。


工作原理

寫操作

這裏寫圖片描述
有一個文件FileA,100M大小。Client將FileA寫入到HDFS中。
HDFS分佈在三個機架上Rack1,Rack2,Rack3。

  1. Client將FileA按64M分塊。分成兩塊,block1和Block2。
  2. Client向NameNode發送寫數據請求,如圖藍色虛線①。
  3. NameNode節點,記錄block信息。並返回可用的DataNode,如粉色虛線②。
    原理:

    • NameNode具有RackAware機架感知功能,這個可以配置。
    • 若client爲DataNode節點,那存儲block時,規則爲:副本1,同client的節點上;副本2,不同機架節點上;副本3,同第二個副本機架的另一個節點上;其他副本隨機挑選。
    • 若client不爲DataNode節點,那存儲block時,規則爲:副本1,隨機選擇一個節點上;副本2,不同副本1,機架上;副本3,同副本2相同的另一個節點上;其他副本隨機挑選。
  4. Client向DataNode發送block1;發送過程是以流式寫入。

流式寫入過程

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

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


讀操作

這裏寫圖片描述

讀操作流程爲

a. client向NameNode發送讀請求。

b. NameNode查看Metadata信息,返回fileA的block的位置。

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

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

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