1. 程式人生 > >HDFS架構——NameNode

HDFS架構——NameNode

    在學習NameNode之前,我們先回顧一下 HDFS 的整個系統構架。

    

    在上一篇文章中我們講過了 NameNode 是管理節點,裡面存放元資料,那麼我們先來看看元資料的儲存細節。

元資料儲存細節

    HDFS 為了保證資料的快速讀寫,並且要保證資料的安全,它就將元資料儲存在記憶體一份,還儲存在磁碟一份,來看看元資料在記憶體中是如何儲存的。

    

    我們舉個例子來說明元資料裡面都有哪些東西,如上圖所示,/test/a.log 代表的是元資料裡面儲存的是該檔案的資訊

3 代表該檔案存了3個副本{blk_1,blk_2} 表示該檔案被切分成了2塊,分別是塊 blk_1 和塊 blk_2; [{blk_1:[h0,h1,h3]},{blk_2:[h0,h2,h4]}] 表示塊 blk_1 的三個副本分別存放在 h0,h1,h3這三臺機器上,blk_2 的三個副本分別存放在 h0,h2,h4這三臺機器上

    綜上,可以對元資料進行一個總結:元素據存放的是資料(檔案)的描述資訊

NameNode

    NameNode是整個檔案系統的管理節點。它維護著整個檔案系統的檔案目錄樹,檔案/目錄的的元資訊和每個檔案對應的資料塊列表。接收使用者的操作請求。

    檔案包括:

      1.fsimage:元資料映象檔案。之前我們已經說過元資料要在記憶體儲存一份,還要在磁碟儲存一份。這裡的fsimage就相是磁碟儲存的那一份,儲存某一時段 NameNode 記憶體元資料資訊。 

      2.edits:操作日誌檔案。比如你上傳或者刪除了一個檔案,edits 裡就會記錄這些操作資訊。

      3.fstime:儲存最近一次 checkpoint 的時間。

    以上這些檔案是儲存在linux的檔案系統中。

NameNode 的工作特點

    NameNode 始終在記憶體中儲存 metedata,用於處理“讀請求”。

    到有“寫請求”到來時,namenode 會首先寫 editlog 到磁碟,即向 edits 檔案中寫日誌,成功返回後,才會修改記憶體,並向客戶端返回。

    Hadoop 會維護一個 fsimage 檔案,也就是 namenode 中 metedata 的映象,但是 fsimage 不會隨時與 namenode 記憶體中的 metedata 保持一致,而是每隔一段時間通過合併 edits 檔案來更新內容。Secondary Namenode 就是用來合併 fsimage 和 edits 檔案來更新 NameNode 的 metedata 的

Secondary NameNode

    HA(高可靠性)的一個解決方案。但不支援熱備。配置即可。

    執行過程:從 NameNode 上下載元資料資訊(fsimage,edits),然後把二者合併,生成新的 fsimage,在本地儲存,並將其推送到 NameNode,替換舊的 fsimage。

Secondary NameNode 的工作流程

    1.secondary 通知 namenode 切換 edits 檔案

    2.secondary 從 namenode 獲得 fsimage 和 edits(通過http)

    3.secondary 將 fsimage 載入記憶體,然後開始合併 edits

    4.secondary 將新的 fsimage 發回給 namenode

    5.namenode 用新的 fsimage 替換舊的 fsimage

什麼時候 checkpoint

    fs.checkpoint.period 指定兩次 checkpoint 的最大時間間隔,預設3600秒。

    fs.checkpoint.size 規定 edits 檔案的最大值,一旦超過這個值則強制 checkpoint,不管是否到達最大時間間隔。預設大小是64M。

資料同步過程

    

    我來舉個例子說明這個過程:假設你在一個月前向HDFS裡面上傳了兩個檔案,而在此之前,HDFS裡面一個檔案都沒有,接下來這一個月你沒有對HDFS做任何操作,Secondary NameNode 在這個月內進行了很多次同步,這個時候記憶體中的 metedata 儲存了2條檔案的描述資訊,fsimage 裡面也有兩條資訊,因為在其間發生了很多次合併,fsimage 和記憶體中的資料已經同步了,而 edits 裡面0條資訊,因為只要 fsimage 跟 edits 進行合併,合併以後原 edits 便會清空並刪除。而 edits 在每合併一次的時候都會生成一個新的 edits,因為此時原 edits正在被操作,如果這時候有資料傳過來就肯定不能儲存在原來的 edits 裡,因此需要有一個新的 edits來儲存新的資料。現在當我們再向HDFS裡上傳一個檔案,edits 裡面就多了一條描述資訊,成功後返回,接著修改記憶體,記憶體中的資訊也加1,現在記憶體中一共3條描述資訊,edits 裡面有1條描述資訊,fsimage 裡面有2條資訊。此時記憶體和 fsimage 裡面的資料就不同步了,然後 Secondary NameNode 就要工作了,獲取 edits 和 fsimage 檔案,進行合併,合併之後總共有了3條資訊,現在就跟 記憶體中的 metedata 同步了。合併的時機就是上面介紹的 checkpoint 的時間

    然後我們看看完整的流程圖,根據我舉的例子來完全理解這個圖: