HDFS架構及原理

 原文連接:HDFS架構及原理

引言

  進入大數據時代,數據集的大小已經超過一臺獨立物理計算機的存儲能力,咱們須要對數據進行分區(partition)並存儲到若干臺單獨的計算機上,也就出現了管理網絡中跨多臺計算機存儲的文件系統:分佈式文件系統(distributed filesystem)。基於hadoop分佈式文件系統HDFS(Hadoop Distributed Filesystem)具有高容錯、高吞吐量等特性,在大數據和AI時代得以普遍應用。html

HDFS設計

HDFS設計初衷:java

  • 低成本:HDFS能夠部署在廉價的PC機上,裝機成本和故障恢復成本都比較低。node

  • 高容錯:數據默認保存三份,若是有多個機架的話,同一機架的機器上保存兩份,不一樣機架的機器上保存一份,若是副本丟失,會自動建立;微信

  • 高吞吐:HDFS是「一次寫入屢次讀寫」的訪問模型,除了在文件末尾追加或直接階段文件,HDFS是不容許修改文件的,這就簡化了數據一致性的問題,而且實現了高吞吐數據訪問。網絡

  • 易擴展:HDFS能夠簡單的經過增長節點,實現水平擴展,存儲容量可隨着節點數量線性增加。架構

HDFS雖然有不少優勢,可是在某些領域目前仍是不適合的,如:分佈式

  • 低時間延遲的數據訪問:有該種需求的,建議用HBase;oop

  • 大量的小文件;性能

  • 多用戶寫入,任意修改文件。大數據

HDFS存儲架構

HDFS採用Master/Slave架構存儲數據,主要由client、namenode、datanode、secondary namenode,四部分組成,其中

  • client:客戶端,表明用戶經過與namenode和datanode交互來訪問整個文件系統,與namenode交互獲取文件的位置信息,與datanode交互進行數據的讀寫。

  • NameNode(管理者):HDFS集羣有兩類節點,並以管理者-工做者模式運行,namenode(管理者,也稱master節點或元數據節點)用來管理文件系統的命名空間,記錄每一個文件中各個塊所在的數據節點信息(並不永久保存塊的位置信息,這些信息會在系統啓動時由數據節點進行重建),配置副本,處理客戶端請求。

  • Datanode(工做者):數據存儲節點,也稱slave節點,是文件系統的工做節點。主要是根據須要存儲並檢索數據塊(受客戶端或namenode調度),並按期向namenode發送所存儲的塊的列表。

  • Secondary NameNode:分擔namenode工做量,是namenode的冷備份,合併fsimage和fsedits而後再發給namenode。它不是HA,它只是階段性的合併fedits和fsimage,以縮短集羣啓動的時間。當namenode失效的時候,Secondary namenode並沒有法馬上提供服務,Secondary namenode甚至沒法保證數據完整性:若是namenode數據丟失的話,在上一次合併後的文件系統的改動會丟失(在hadoop2.x版本,當啓用hdfs ha時,不在存在這一項)

HDFS構建原則:

  • 元數據與數據分離:文件自己的屬性(即元數據)與文件所持有的數據分離;

  • 主/從架構:一個HDFS集羣是由一個NameNode和多個DataNode組成;

  • 一次寫入屢次讀取:HDFS中的文件在任什麼時候間只能有一個Writer。當文件被建立,接着寫入數據,最後,一旦文件被關閉,就不能再修改;

  • 移動計算比移動數據更划算:數據運算,越靠近數據,執行運算的性能就越好,因爲hdfs數據分佈在不一樣機器上,要讓網絡的消耗最低,並提升系統的吞吐量,最佳方式是將運算的執行移到離它要處理的數據更近的地方,而不是移動數據。

HDFS寫文件

操做場景

爲便於理解HDFS寫文件的過程,咱們假設,有一個文件FileA,100M大小。Client將FileA寫入到HDFS上,HDFS按默認配置(寫文件參考博客地址:http://www.cnblogs.com/laov/p/3434917.html)。

寫操做流程

 

HDFS分佈在三個機架上Rack1,Rack2,Rack3。

  • Client將FileA按64M分塊。分紅兩塊,block1和Block2;

  • Client向nameNode發送寫數據請求,如圖藍色虛線①——>。

  • NameNode節點,記錄block信息。並返回可用的DataNode,如粉色虛線②———>。

     Block1: host2,host1,host3

     Block2: host7,host8,host4

 原理:NameNode具備RackAware機架感知功能,這個能夠配置。若client爲DataNode節點,那存儲block時,規則爲:副本1,同client的節點上;副本2,不一樣機架節點上;副本3,同第二個副本機架的另外一個節點上;其餘副本隨機挑選。若client不爲DataNode節點,那存儲block時,規則爲:副本1,隨機選擇一個節點上;副本2,不一樣副本1,機架上;副本3,同副本2相同的另外一個節點上;其餘副本隨機挑選。

  • 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發送消息,說我寫完了,如圖黃色粗實線,這樣就完畢了。

 HDFS讀文件

  HDFS讀取文件的主要順序:

  • 客戶端調用FileSystem對象的open()方法打開但願讀取的文件,即獲取DistributedFileSystem的實例;

  •  DistributedFileSystem經過RPC調用namenode,用於肯定文件起始塊(block)的位置,對於每個block,namenode返回存有該塊複本的datanode地址,這些datanode是根據他們與客戶端的距離進行排序的;

  • 前2步返回一個FSDataInputStream對象(一個支持文件定位的輸入流)給client客戶端並讀取數據,該對象會封裝爲DFSInputStream對象,該對象管理datanode和namenode的I/O。客戶端對這個輸入流調用read()方法,DFSInputStream找出距離最近的datanode;

  •  對數據流反覆調用read()方法,將數據從datanode傳輸到客戶端;

  • 到達第一個block的末端時,DFSInputStream會關閉與datanode的鏈接,尋找下一個block的最佳datanode;

  • 客戶端從流中讀取數據時,block是按照打開DFSInputStream與datanode新建鏈接的順序讀取的,一旦客戶端完成讀取,就會對FSDataInputStream調用close()方法,關閉掉全部的流。

Hadoop2.x新特性:HDFS

  Hadoop2.x由HDFS、MapReduce和Yarn三個分支構成,在hadoop2.x版本中,引入NameNode Federation和HA。

  在hadoop1.x時,存在單namenode容量和性能限制,一方面受制於java內存管理能力,另外一方面,因爲全部元數據信息的讀取和操做都要與namenode進行通訊,當集羣規模變大後,namenode將成爲性能瓶頸。

       因而,在hadoop2.x時,引入了NameNode Federation和HA,NameNode Federation由多個nameservice組成,每一個nameservice由一個或兩個namenode組成,每一個namenode分管一部分目錄,多個namenode共用集羣datanode的存儲資源。這樣當namenode內存受限時就可以方便的擴展內存,並且每一個namenode獨立工做,一個namenode的掛掉並不會影響其餘namenode提供服務。同時,使用HA來解決特定namenode由於缺乏熱備存在的單點故障問題。

                                                   圖5 NameNode Federation

 

 

 

全文詳細內容,請點擊連接:http://mp.weixin.qq.com/s/QyOyIIb5SFKSHxVIUBrqlw

 

 

更多精彩內容,歡迎掃碼關注如下微信公衆號:大數據技術宅。大數據、AI從關注開始
相關文章
相關標籤/搜索