HDFS的架構及原理


  HDFS(Hadoop Distributed File System)是Hadoop核心組成之一,是分布式計算中數據存儲管理的基礎,被設計成適合運行在通用硬件上的分布式文件系統。HDFS架構中有兩類節點,一類是NameNode,又叫“元數據節點”,另一類是DataNode,又叫“數據節點”,分別執行Master和Worker的具體任務。HDFS是一個(Master/Slave)體系結構,“一次寫入,多次讀取”。HDFS的設計思想:分而治之—將大文件、大批量文件分布式存放在大量獨立的機器上。

 

一、HDFS的優缺點

優點:

  1、高容錯性。數據保存多個副本,通過增加副本的形式提高容錯性,某個副本丟失后,它可以通過其它副本自動恢復。

  2、適合大批量數據處理。處理達到GB、TB,甚至PB級別的數據,處理百萬規模以上的文件數量,處理10K節點的規模。

  3、流式文件訪問。一次寫入多次讀取,文件一旦寫入不能修改,只能追加,保證數據一致性。

  4、可構建在廉價機器上。通過多副本機制提高可靠性,提供容錯和恢復機制。

缺點(不適用HDFS的場景):

  1、低延時數據訪問。做不到毫秒級存儲數據,但是適合高吞吐率(某一時間內寫入大量的數據)的場景。

  2、小文件存儲。存儲大量小文件會占用NameNode大量的內存來存儲文件、目錄和塊信息。

  3、並發寫入、隨機讀寫。一個文件不允許多個線程同時寫,僅支持數據追加,不支持文件的隨機修改。

 

二、HDFS存儲架構

數據存儲架構圖:

HDFS采用Master/Slave的架構存儲數據,由HDFS Client、NameNode、DataNode和Secondary NameNode四部分組成。

Client:客戶端

  1、文件切分。文件上傳HDFS時,Client按照Block大小切分文件,然后進行存儲

  2、與NameNode交互,獲取文件位置信息

  3、與DataNode交互,讀取或寫入數據

  4、Client提供一些命令管理和訪問HDFS

NameNode:Master(管理者)

  1、管理HDFS的名稱空間

  2、管理數據塊(Block)映射信息

  3、配置副本策略

  4、處理客戶端讀寫請求

DataNode:Slave(NN下達命令執行實際的操作)

  1、存儲實際的數據塊

  2、執行數據塊的讀/寫操作

Secondary NameNode:並非NameNode的熱備,當NN停止服務時,它並不能馬上替換NN並提供服務

  1、輔助NN,分擔其工作量

  2、定期合並fsimage和fsedits,並推送給NN

  3、在緊急情況下,可輔助恢復NN

 

三、HDFS數據讀寫

文件讀取步驟:

  1、首先調用FileSystem的open方法獲取一個DistributedFileSystem實例。

  2、DistributedFileSystem通過RPC(遠程過程調用)獲得文件的第一批block的locations,同一個block按照重復數返回多個locations,這些locations按照Hadoop拓撲結構排序,按照就近原則進行排序。

  3、前兩步結束后會返回一個FSDataInputStream對象,通過調用read方法時,該對象會找出離客戶端最近的DataNode並連接。

  4、數據從DataNode源源不斷地流向客戶端。

  5、如果第一個block塊數據讀取完成,就會關閉指向第一個block塊的DataNode連接,接着讀取下一個block塊。

  6、如果第一批blocks讀取完成,FSDataInputStream會向NN獲取下一批blocks的locations,然后重復4、5步驟,直到所有blocks讀取完成,這時就會關閉所有的流。

文件寫入步驟:

  1、客戶端通過調用DistributedFileSystem的create方法,創建一個新文件。

  2、DistributedFileSystem通過RPC(遠程過程調用)調用NameNode,去創建一個沒有blocks關聯的新文件。創建前,NN會進行各種校驗,如果校驗通過,NN就會記錄下新文件,否則拋出I/O異常。

  3、前兩步結束后會返回一個FSDataOutputStream對象,客戶端開始寫數據到FSDataOutputStream,FSDataOutputStream會把數據切成一個個小packet,然后排成data queue。

  4、DataStreamer 會去處理接受 data queue,它先問詢 NameNode 這個新的 block 最適合存儲的在哪幾個DataNode里,比如重復數是3,那么就找到3個最適合的 DataNode,把它們排成一個 pipeline。DataStreamer 把 packet 按隊列輸出到管道的第一個 DataNode 中,第一個 DataNode又把 packet 輸出到第二個 DataNode 中,以此類推。

  5、DFSOutputStream 還有一個隊列叫 ack queue,也是由 packet 組成,等待DataNode的收到響應,當pipeline中的所有DataNode都表示已經收到的時候,這時akc queue才會把對應的packet包移除掉。

  6、客戶端完成寫數據后,調用close方法關閉寫入流。

  7、DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一個 ack 后,通知 NameNode 把文件標示為已完成。

  RackAware機架感知功能:

  1、若client為DataNode節點,那存儲block時,規則為:副本1存儲在同client的節點上;副本2存儲在不同機架節點上;副本3同第副本2機架的另外一個節點上;其它副本隨機挑選。

  2、若client不為DataNode節點,那存儲block時,規則為:副本1隨機選擇一個節點;副本2存儲在不同於副本1的機架節點;副本3同副本2所在機架的另一個節點;其它副本隨機挑選。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM