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 的時間

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

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章