1. 程式人生 > >HDFS儲存架構剖析以及讀寫流程

HDFS儲存架構剖析以及讀寫流程

這裡寫圖片描述

HDFS儲存架構主要由三部分組成:NameNode,DataNode,Client

NameNode

  • Namenode 是一箇中心伺服器,單一節點(簡化系統的設計和實現),負責管理檔案系統的名字空間(namespace)以及客戶端對檔案的訪問。
  • 檔案操作,NameNode 負責檔案元資料的操作,DataNode負責處理檔案內容的讀寫請求,跟檔案內容相關的資料流不經過NameNode,只會詢問它跟那個DataNode聯絡,否則NameNode會成為系統的瓶頸。
  • 副本存放在哪些DataNode上由 NameNode來控制,根據全域性情況做出塊放置決定,讀取檔案時NameNode儘量讓使用者先讀取最近的副本,降低頻寬消耗和讀取時延
  • Namenode 全權管理資料塊的複製,它週期性地從叢集中的每個Datanode接收心跳訊號和塊狀態報告(Blockreport)。接收到心跳訊號意味著該Datanode節點工作正常。塊狀態報告包含了一個該Datanode上所有資料塊的列表。

DataNode:

  • 一個數據塊在DataNode以檔案儲存在磁碟上,包括兩個檔案,一個是資料本身,一個是元資料包括資料塊的長度,塊資料的校驗和,以及時間戳
  • DataNode啟動後向NameNode註冊,通過後,週期性(1小時)的向NameNode上報所有的塊資訊。
  • 心跳是每3秒一次,心跳返回結果帶有NameNode給該DataNode的命令如複製塊資料到另一臺機器,或刪除某個資料塊。如果超過10分鐘沒有收到某個DataNode 的心跳,則認為該節點不可用。
  • 叢集執行中可以安全加入和退出一些機器

Client

  • 客戶端,系統使用者,呼叫HDFS API操作檔案;與NameNode互動獲取檔案元資料;與DataNode互動進行資料讀寫。

讀檔案流程

這裡寫圖片描述
(1)開啟分散式檔案
呼叫 分散式檔案 DistributedFileSystem.open()方法
(2)從 NameNode 獲得 DataNode 地址
DistributedFileSystem 使用 RPC 呼叫 NameNode,NameNode 返回存有該副本的 DataNode 地址,DistributedFileSystem 返 回一個輸入流 FSDataInputStream物件,該物件封存了輸入流 DFSInputStream
(3)連線到DataNode


呼叫 輸入流 FSDataInputStream 的 read() 方法,從而 輸入流 DFSInputStream 連線 DataNodes
(4)讀取DataNode
反覆呼叫 read()方法,從而將資料從 DataNode 傳輸到客戶端
(5)讀取另外的DataNode直到完成
到達塊的末端時候,輸入流 DFSInputStream 關閉與DataNode 連線, 尋找下一個 DataNode
(6)完成讀取,關閉連線
即呼叫輸入流 FSDataInputStream.close()


寫檔案流程

這裡寫圖片描述
(1)傳送建立檔案請求:呼叫分散式檔案系統DistributedFileSystem.create()方法
(2)NameNode中建立檔案記錄:分散式檔案系統DistributedFileSystem 傳送 RPC 請求給namenode,namenode 檢查許可權後建立一條記錄,返回輸出流 FSDataOutputStream,封裝了輸出流 DFSOutputDtream
(3)客戶端寫入資料:輸出流 DFSOutputDtream 將資料分成一個個的資料包,並寫入內部佇列。DataStreamer 根據 DataNode 列表來要求 namenode 分配適合的新塊來儲存資料備份。一組DataNode 構成管線(管線的 DataNode 之間使用 Socket 流式通訊)
(4)使用管線傳輸資料:DataStreamer 將資料包流式傳輸到管線第一個DataNode,第一個DataNode 再傳到第二個DataNode ,直到完成。
(5)確認佇列:DataNode 收到資料後傳送確認,管線的DataNode所有的確認組成一個確認佇列。所有DataNode 都確認,管線資料包刪除。
(6)關閉:客戶端對資料量呼叫close()方法。將剩餘所有資料寫入DataNode管線,並聯系NameNode且傳送檔案寫入完成資訊之前等待確認。
(7)NameNode確認
(8)故障處理:若過程中發生故障,則先關閉管線, 把佇列中所有資料包添加回去佇列,確保資料包不漏。為另一個正常DataNode的當前資料塊指定一個新的標識,並將該標識傳送給NameNode, 一遍故障DataNode在恢復後刪除上面的不完整資料塊. 從管線中刪除故障DataNode 並把餘下的資料塊寫入餘下正常的DataNode。NameNode發現複本量不足時,會在另一個節點建立一個新的複本