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所在機架的另一個節點;其它副本隨機挑選。