圖文詳解 HDFS 的工作機制及其原理

Data跳動發表於2022-05-19

大家好,我是大D。

今天開始給大家分享關於大資料入門技術棧——Hadoop的學習內容。

初識 Hadoop

為了解決大資料中海量資料的儲存與計算問題,Hadoop 提供了一套分散式系統基礎架構,核心內容包含HDFS ( Hadoop Distributed File System, 分散式檔案系統)、MapReduce計算引擎和YARN (Yet Another Resource Negotiator,另一種資源協調者)統一資源管理排程。

隨著大資料技術的更新迭代,如今 Hadoop 不再是一個單獨的技術,而是一套大資料處理的生態圈,如下圖所示。
image

除了上述提到的 Hadoop 三個核心元件之外,還有資料採集工具Sqoop與Flume,它們可以將海量資料抽取到Hadoop平臺上,進行後續的大資料分析;ZooKeeper能夠保證Hadoop叢集在部分節點當機的情況下依然可靠執行(乾貨總結!一文搞定 ZooKeeper ,面試再也不用背八股(文末送PDF));基於Hadoop運算平臺的資料倉儲Hive、流式計算Storm、資料探勘工具Mahout和分散式資料庫HBase等大資料技術框架。

HDFS

HDFS (Hadoop Distributed File System, 分散式檔案系統) 是Google公司的GFS論文思想的實現,也作為 Hadoop 的儲存系統,它包含客戶端(Client)、後設資料節點(NameNode)、備份節點(Secondary NameNode)以及資料儲存節點(DataNode)。
image

Client

HDFS 利用分散式叢集節點來儲存資料,並提供統一的檔案系統訪問介面。這樣,使用者在使用分散式檔案系統時就如同在使用普通的單節點檔案系統一樣,僅通過對 NameNode 進行互動訪問就可以實現操作HDFS中的檔案。HDFS提供了非常多的客戶端,包括命令列介面、Java API、Thrift介面、Web介面等。

NameNode

NameNode 作為 HDFS 的管理節點,負責儲存和管理分散式系統中所有檔案的後設資料資訊,如果將 HDFS 比作一本書,那麼 NameNode 可以理解為這本書的目錄。

其職責主要有以下三點:

  1. 負責接收 Client 傳送過來的讀寫請求;
  2. 管理和維護HDFS的名稱空間: 後設資料是以映象檔案(fsimage)和編輯日誌(editlog)兩種形式存放在本地磁碟上的,可以記錄 Client 對 HDFS 的各種操作,比如修改時間、訪問時間、資料塊資訊等。
  3. 監控和管理DataNode:負責監控叢集中DataNode的健康狀態,一旦發現某個DataNode宕掉,則將該 DataNode 從 HDFS 叢集移除並在其他 DataNode 上重新備份該 DataNode 的資料(該過程被稱為資料重平衡,即rebalance),以保障資料副本的完整性和叢集的高可用性。

SecondaryNameNode

SecondaryNameNode 是 NameNode 後設資料的備份,在NameNode當機後,SecondaryNameNode 會接替 NameNode 的工作,負責整個叢集的管理。並且出於可靠性考慮,SecondaryNameNode 節點與 NameNode 節點執行在不同的機器上,且 SecondaryNameNode 節點與 NameNode 節點的記憶體要一樣大。

同時,為了減小 NameNode 的壓力,NameNode 並不會自動合併 HDFS中的後設資料映象檔案(fsimage)和編輯日誌(editlog),而是將該任務交由 SecondaryNameNode 來完成,在合併完成後將結果傳送到NameNode, 並再將合併後的結果儲存到本地磁碟。

DataNode

存放在HDFS上的檔案是由資料塊組成的,所有這些塊都儲存在DataNode節點上。DataNode 負責具體的資料儲存,並將資料的元資訊定期彙報給 NameNode,並在 NameNode 的指導下完成資料的 I/O 操作。

實際上,在DataNode節點上,資料塊就是一個普通檔案,可以在DataNode儲存塊的對應目錄下看到(預設在$(dfs.data.dir)/current的子目錄下),塊的名稱是 blk_ID,其大小可以通過dfs.blocksize設定,預設為128MB。

初始化時,叢集中的每個 DataNode 會將本節點當前儲存的塊資訊以塊報告的形式彙報給 NameNode。在叢集正常工作時,DataNode 仍然會定期地把最新的塊資訊彙報給 NameNode,同時接收 NameNode 的指令,比如建立、移動或刪除本地磁碟上的資料塊等操作。

HDFS資料副本

HDFS 檔案系統在設計之初就充分考慮到了容錯問題,會將同一個資料塊對應的資料副本(副本個數可設定,預設為3)存放在多個不同的 DataNode 上。在某個 DataNode 節點當機後,HDFS 會從備份的節點上讀取資料,這種容錯性機制能夠很好地實現即使節點故障而資料不會丟失。

HDFS的工作機制

NameNode 工作機制

NameNode簡稱NN

  • NN 啟動後,會將映象檔案(fsimage)和編輯日誌(editlog)載入進記憶體中;
  • 客戶端發來增刪改查等操作的請求;
  • NN 會記錄下操作,並滾動日誌,然後在記憶體中對操作進行處理。

image

SecondaryNameNode工作機制

SecondaryNameNode簡稱2NN

  • 當編輯日誌資料達到一定量或者每隔一定時間,就會觸發 2NN 向 NN 發出 checkpoint請求;
  • 如果發出的請求有回應,2NN 將會請求執行 checkpoint 請求;
  • 2NN 會引導 NN 滾動更新編輯日誌,並將編輯日誌複製到 2NN 中;
  • 同編輯日誌一樣,將映象檔案複製到 2NN 本地的 checkpoint 目錄中;
  • 2NN 將映象檔案匯入記憶體中,回放編輯日誌,將其合併到新的fsimage.ckpt;
  • 將 fsimage.ckpt 壓縮後寫入到本地磁碟;
  • 2NN 將 fsimage.ckpt 傳給 NN;
  • NN 會將新的 fsimage.ckpt 檔案替換掉原來的 fsimage,然後直接載入和啟用該檔案。

HDFS檔案的讀取流程

image

  • 客戶端呼叫 FileSystem 物件的open()方法,其實獲取的是一個分散式檔案系統(DistributedFileSystem)例項;
  • 將所要讀取檔案的請求傳送給 NameNode,然後 NameNode 返回檔案資料塊所在的 DataNode 列表(是按照 Client 距離 DataNode 網路拓撲的遠近進行排序的),同時也會返回一個檔案系統資料輸入流(FSDataInputStream)物件;
  • 客戶端呼叫 read() 方法,會找出最近的 DataNode 並連線;
  • 資料從 DataNode 源源不斷地流向客戶端。

HDFS檔案的寫入流程

image

  • 客戶端通過呼叫分散式檔案系統(DistributedFileSystem)的create()方法建立新檔案;
  • DistributedFileSystem 將檔案寫入請求傳送給 NameNode,此時 NameNode 會做各種校驗,比如檔案是否存在,客戶端有無許可權去建立等;
  • 如果校驗不通過則會丟擲I/O異常。如果校驗通過,NameNode 會將該操作寫入到編輯日誌中,並返回一個可寫入的 DataNode 列表,同時,也會返回檔案系統資料輸出流(FSDataOutputStream)的物件;
  • 客戶端在收到可寫入列表之後,會呼叫 write() 方法將檔案切分為固定大小的資料包,並排成資料佇列;
  • 資料佇列中的資料包會寫入到第一個 DataNode,然後第一個 DataNode 會將資料包傳送給第二個 DataNode,依此類推。
  • DataNode 收到資料後會返回確認資訊,等收到所有 DataNode 的確認資訊之後,寫入操作完成。

最後

更多圖解大資料技術的乾貨文章,關注公眾號: Data跳動,回覆:圖解系列。
另外,非常歡迎大家掃描下方二維碼,加我VX:Abox_0226,備註「進群」,有關大資料技術的問題在群裡一起探討。

相關文章