博客 / 詳情

返回

【趙渝強老師】史上最詳細:Hadoop HDFS的體系架構

在Hadoop HDFS的體系架構中,包含了三個組成部分。它們分別是:NameNode、DataNode和SecondaryNameNode。下圖摘至Hadoop官方的網站,它説明了HDFS的體系架構。
image.png

視頻講解如下:
https://www.bilibili.com/video/BV1eh23Y5En9/?aid=113282883000...

一、NameNode的職責

NameNode,即名稱節點,它是HDFS的主節點,其主要作用體現在以下幾個方面。

1、管理和維護HDFS

NameNode管理和維護HDFS的元信息文件fsimage文件和操作日誌文件edits文件,以及管理和維護HDFS命名空間。

1.1 HDFS的元信息文件

fsimage文件是HDFS的元信息文件,該文件中保存了目錄和文件的相關信息。通過讀取fsimage文件就能獲取到HDFS的數據分佈情況。在部署好的環境中,可以在$HADOOP_HOME/tmp/dfs/name/current目錄中找到該文件,如下圖所示。
image.png

HDFS提供了元信息查看器,幫助我們來查看元信息文件中的內容。執行下面的命令:

hdfs oiv -i fsimage_0000000000000016309 -o /root/a.xml -p XML

該命令將fsimage元信息文件格式化生成一個XML文件。查看XML文件的內容如下圖所示。這裏可以看到HDFS中有一個input目錄和一個data.txt文件。
image.png

1.2 HDFS的操作日誌文件

NameNode維護的另一個系統文件就是edits文件,該文件中記錄的客户端操作。HDFS也提供了日誌查看器用來查看edits文件中的內容。edits文件與fsimage文件存放在同一個目錄下。執行下面的命令:

hdfs oev -i edits_inprogress_0000000000000000105 -o /root/b.xml

該命令將edits日誌文件格式化生成一個XML文件。查看XML文件的內容如下圖所示,可以看成這條日誌記錄的是創建一個目錄的操作。
image.png

2、接收客户端的請求

客户端的操作請求,無論是上傳數據或者下載數據都是由NameNode負責接收和處理。最終將數據按照數據塊的形式保存到數據節點DataNode上。下圖説明了HDFS數據上傳的過程。

image.png

假設需要上傳200M大小的一個文件。按照數據塊128M的大小為單位進行切塊,該文件就會被切分成兩個數據塊。客户端發出上傳命令後,由DistributedFileSystem對象創建一個DFSClient對象,該對象負責與NameNode建立RPC通信,並請求NameNode生成文件的元信息。當NameNode接收到請求後,會生成對應的元信息,如圖3.5中的第4步所示。元信息包含了以下的內容:數據塊的個數、存儲的位置,以及冗餘的位置。例如:數據塊1將保存到了DataNode1上,同時,對應的兩份冗餘存儲在DataNode2和DataNode3上。NameNode會將生成的元信息返回給DistributedFileSystem對象,並由其創建輸出流對象FSDataOutputStream。然後根據生成的元信息上傳數據塊。例如圖3.5中的第7步所示,客户端會將數據塊1上傳到了DataNode1上,並通過水平復制將其複製到其他的冗餘節點上,最終保證數據塊冗餘度的要求。通過這樣的方式,直到所有的數據塊上傳成功。

瞭解到了HDFS數據上傳的過程,下圖説明了HDFS數據下載的過程。
image.png

二、DataNode的職責

數據節點的主要職責是按照數據塊來保存數據。從Hadoop 2.x開始,數據塊默認大小是128M。在配置好的環境中,數據塊默認保存到了Hadoop安裝目錄下的tmp目錄下,如下圖所示。
image.png

從上圖可以看出每個數據塊文件都是以blk的前綴開頭,並且默認大小是134217728字節,即128M。

三、SecondaryNameNode的職責

SecondaryNameNode是HDFS的第二名稱節點,其主要作用是合併日誌。因為HDFS的最新狀態信息是記錄在edits日誌中,而數據的元信息需要記錄在fsimage中。換而言之,fsimage文件維護的並不是最新的HDFS狀態信息。因此需要一種機制將edits日誌中的最新狀態信息合併寫入fsimage文件中,這個工作就是由SecondaryNameNode完成的。
SecondaryNameNode不是NameNode的熱備,因此當NameNode出現問題的時候,不能由SecondaryNameNode頂替NameNode的工作。下圖説明的SecondaryNameNode合併日誌的過程。
image.png

那麼SecondaryNameNode會在什麼情況下執行日誌文件的合併呢?觸發的條件就是當HDFS發出檢查點的時候。在默認情況下,Secondary NameNode每小時或在每100萬次事務後執行檢查點操作,以先到者為準。可以根據以下兩個條參數配置檢查點操作的頻率:

dfs.namenode.checkpoint.txns:
該值默認值是"1000000",即100w條記錄。該屬性可以指定自上次執行檢查點操作以來的編輯日誌事務數。

dfs.namenode.checkpoint.period:
該值默認值是"3600s",即1小時。該屬性可以指定自上次執行檢查點操作以來經過的時間。
user avatar xianjie2020 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.