前方高能 | HDFS 的架構,你吃透了嗎?

本文已收錄github:https://github.com/BigDataScholar/TheKingOfBigData,裏面有我準備的大數據高頻考點,Java一線大廠面試題資源,上百本免費電子書籍,做者親繪大數據生態圈思惟導圖…持續更新,歡迎star!html

前言

        HDFS 是 Hadoop 中存儲數據的基石,存儲着全部的數據,具備高可靠性,高容錯性,高可擴展性,高吞吐量等特徵,可以部署在大規模廉價的集羣上,極大地下降了部署成本。有意思的是,其良好的架構特徵使其可以存儲海量的數據。本篇文章,咱們就來系統學習一下,Hadoop HDFS的架構!
在這裏插入圖片描述node

HDFS架構

        HDFS採用 Master/Slave 架構存儲數據,且支持 NameNode 的 HA。HDFS架構主要包含客戶端,NameNodeSecondaryNameNodeDataNode 四個重要組成部分,如圖所示:git

在這裏插入圖片描述

        (1)客戶端向NameNode發起請求,獲取元數據信息,這些元數據信息包括命名空間、塊映射信息及 DataNode 的位置信息等。github

        (2)NameNode 將元數據信息返回給客戶端。web

        (3)客戶端獲取到元數據信息後,到相應的 DataNode 上讀/寫數據面試

        (4)相關聯的 DataNode 之間會相互複製數據,以達到 DataNode 副本數的要求apache

        (5)DataNode 會按期向 NameNode 發送心跳信息,將自身節點的狀態信息報告給 NameNode。bash

        (6)SecondaryNameNode 並非 NameNode 的備份。SecondaryNameNode 會按期獲取 NameNode 上的 fsimageedits log 日誌,並將兩者進行合併,產生 fsimage.ckpt 推送給 NameNode。服務器

一、NameNode

        NameNode 是整個 Hadooop 集羣中相當重要的組件,它維護着整個 HDFS 樹,以及文件系統樹中全部的文件和文件路徑的元數據信息。這些元數據信息包括文件名命令空間文件屬性(文件生成的時間、文件的副本數、文件的權限)、文件數據塊文件數據塊與所在 DataNode 之間的映射關係等。架構

        一旦 NameNode 宕機或 NameNode 上的元數據信息損壞或丟失,基本上就會丟失 Hadoop 集羣中存儲的全部數據,整個 Hadoop 集羣也會隨之癱瘓

        在 Hadoop 運行的過程當中, NameNode 的主要功能以下圖所示:
在這裏插入圖片描述

二、SecondaryNameNode

        SecondaryNameNode 並非 NameNode 的備份,在NameNode 發生故障時也不能馬上接管 NameNode 的工做。SecondaryNameNode 在 Hadoop 運行的過程當中具備兩個做用:一個是備份數據鏡像,另外一個是按期合併日誌與鏡像,所以能夠稱其爲 Hadoop 的檢查點(checkpoint)。SecondaryNameNode 按期合併 NameNode 中的 fsimage 和 edits log,可以防止 NameNode 重啓時把整個 fsimage 鏡像文件加載到內存,耗費過長的啓動時間

        SecondaryNameNode 的工做流程如圖所示:
在這裏插入圖片描述        SecondaryNameNode的工做流程以下:

        (1)SecondaryNameNode 會通知 NameNode 生成新的 edits log 日誌文件。

        (2)NameNode 生成新的 edits log 日誌文件,而後將新的日誌信息寫到新生成的 edits log 日誌文件中。

        (3)SecondaryNameNode 複製 NameNode 上的 fsimage 鏡像和 edits log 日誌文件,此時使用的是 http get 方式。

        (4)SecondaryNameNodefsimage將鏡像文件加載到內存中,而後執行 edits log 日誌文件中的操做,生成新的鏡像文件 fsimage.ckpt

        (5)SecondaryNameNodefsimage.ckpt 文件發送給 NameNode,此時使用的是 http post 方式。

        (6)NameNodeedits log 日誌文件替換成新生成的 edits.log 日誌文件,一樣將 fsimage文件替換成 SecondaryNameNode 發送過來的新的 fsimage 文件。

        (7)NameNode 更新 fsimage 文件,將這次執行 checkpoint 的時間寫入 fstime 文件中。

        通過 SecondaryNameNodefsimage 鏡像文件和 edits log 日誌文件的複製和合並操做以後,NameNode 中的 fsimage 鏡像文件就保存了最新的 checkpoint 的元數據信息, edits log 日誌文件也會從新寫入數據,兩個文件中的數據不會變得很大。所以,當重啓 NameNode 時,不會耗費太長的啓動時間。

        SecondaryNameNode 週期性地進行 checkpoint 操做須要知足必定的前提條件,這些條件以下

        (1)edits log 日誌文件的大小達到了必定的閾值,此時會對其進行合併操做。

        (2)每隔一段時間進行 checkpoint 操做。

        這些條件能夠在core-site.xml文件中進行配置和調整,代碼以下所示:

<property>
         <name>fs.checkpoint.period</name>
         <value>3600</value>
</property>
<property>
         <name>fs.checkpoint.size</name>
         <value>67108864</value>
</property>

        上述代碼配置了 checkpoint 發生的時間週期和 edits log日誌文件的大小閾值,說明以下。

        (1)fs.checkpoint.period:表示觸發 checkpoint發生的時間週期,這裏配置的時間週期爲 1 h。

        (2)fs.checkpoint.size:表示 edits log 日誌文件大小達到了多大的閾值時會發生 checkpoint操做,這裏配置的 edits log大小閾值爲 64 MB。

        上述代碼中配置的 checkpoint操做發生的狀況以下:

        (1)若是 edits log 日誌文件通過 1 h 未能達到 64 MB,可是知足了 checkpoint發生的週期爲 1 h 的條件,也會發生 checkpoint 操做。

        (2)若是 edits log日誌文件大小在 1 h 以內達到了 64MB,知足了 checkpoint 發生的 edits log日誌文件大小閾值的條件,則會發生 checkpoint操做。

注意:若是 NameNode 發生故障或 NameNode 上的元數據信息丟失或損壞致使 NameNode 沒法啓動,此時就須要人工干預,將 NameNode 中的元數據狀態恢復到 SecondaryNameNode 中的元數據狀態。此時,若是 SecondaryNameNode 上的元數據信息與 NameNode 宕機時的元數據信息不一樣步,則或多或少地會致使 Hadoop 集羣中丟失一部分數據。出於此緣由,應儘可能避免將 NameNode 和 SecondaryNameNode 部署在同一臺服務器上

三、DataNode

        DataNode 是真正存儲數據的節點,這些數據以數據塊的形式存儲在 DataNode 上。一個數據塊包含兩個文件:一個是存儲數據自己的文件,另外一個是存儲元數據的文件(這些元數據主要包括數據塊的長度、數據塊的檢驗和、時間戳)。

        DataNode 運行時的工做機制如圖所示:

在這裏插入圖片描述
        如圖所示,DataNode 運行時的工做機制以下:

        (1)DataNode啓動以後,向 NameNode 註冊

        (2)NameNode 返回註冊成功的消息給 DataNode。

        (3)DataNode 收到 NameNode 返回的註冊成功的信息以後,會週期性地向 NameNode 上報當前 DataNode 的全部塊信息,默認發送全部數據塊的時間週期是 1h

        (4)DataNode 週期性地向NameNode 發送心跳信息;NameNode 收到 DataNode 發來的心跳信息後,會將DataNode 須要執行的命令放入到 心跳信息的 返回數據中,返回給 DataNode。DataNode 向 NameNode 發送心跳信息的默認時間週期是 3s

        (5)NameNode 超過必定的時間沒有收到 DataNode 發來的心跳信息,則 NameNode 會認爲對應的 DataNode 不可用。默認的超時時間是 10 min。

        (6)在存儲上相互關聯的 DataNode 會同步數據塊,以達到數據副本數的要求

        當 DataNode 發生故障致使 DataNode 沒法與 NameNode 通訊時,NameNode 不會當即認爲 DataNode 已經 「死亡」。要通過一段短暫的超時時長後纔會認爲 DataNode 已經 「死亡」。HDFS 中默認的超時時長爲 10 min + 30 s,能夠用以下公式來表示這個超時時長:

timeout = 2 * dfs.namenode.heartbeat.recheck-interval +10 * dfs.heartbeat.interval

        其中,各參數的含義以下:

        (1)timeout:超時時長。

        (2)dfs.namenode.heartbeat.recheck-interval:檢查過時 DataNode 的時間間隔,與 dfs.heartbeat.interval 結合使用,默認的單位是 ms,默認時間是 5 min。

        (3)dfs.heartbeat.interval:檢測數據節點的時間間隔,默認的單位爲 s,默認的時間是 3 s。

        因此,能夠得出 DataNode 的默認超時時長爲 630s,以下所示:

timeout = 2 * 5 * 60 + 10 * 3 = 630s

        DataNode 的超時時長也能夠在 hdfs-site.xml文件中進行配置,代碼以下所示:

<property>
     <name>dfs.namenode.heartbeat.recheck-interval</name>
     <value>3000</value>
</property>
<property>
     <name>dfs.heartbeat.interval</name>
     <value>2</value>
</property>

        根據上面的公式能夠得出,在配置文件中配置的超時時長爲:

timeout = 2 * 3000 / 1000 + 10 * 2 = 26s

        當 DataNode 被 NameNode 斷定爲 「死亡」時,HDFS 就會立刻自動進行數據塊的容錯複製。此時,當被 NameNode 斷定爲 「死亡」 的 DataNode 從新加入集羣中時,若是其存儲的數據塊並無損壞,就會形成 HDFS 上某些數據塊的備份數超過系統配置的備份數目

        HDFS上刪除多餘的數據塊須要的時間長短和數據塊報告的時間間隔有關。該參數能夠在 hdfs-site.xml文件中進行配置,代碼以下所示:

<property>
     <name>dfs.blockreport.intervalMsec</name>
     <value>21600000</value>
     <description>Determines block reporting interval in milliseconds.</description>
</property>

        數據塊報告的時間間隔默認爲 21600000ms,即 6h,能夠經過調整此參數的大小來調整數據塊報告的時間間隔。


小結

        本篇文章算是對 HDFS的架構解釋的比較透徹,相信不管是剛入門的小白,仍是已經有了必定基礎的大數據學者,看完都會有必定的收穫,但願你們平時學習也可以多學會總結,用輸出倒逼本身輸入!
        

巨人的肩膀

一、《海量數據處理與大數據技術實戰》
二、《大數據平臺架構與原型實現》
三、https://baike.baidu.com/item/hdfs/4836121?fr=aladdin
四、http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_user_guide.html

        好了,本篇文章就到這裏,更多幹貨文章請關注個人公衆號。你知道的越多,你不知道的也越多。我是夢想家,點個關注,咱們下一期見!
在這裏插入圖片描述

本文同步分享在 博客「大數據夢想家」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索