溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Hadoop中HDFS架構(gòu)是怎么樣的

發(fā)布時間:2021-12-09 14:30:49 來源:億速云 閱讀:211 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要介紹Hadoop中HDFS架構(gòu)是怎么樣的,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

前言

        HDFS 是 Hadoop 中存儲數(shù)據(jù)的基石,存儲著所有的數(shù)據(jù),具有高可靠性,高容錯性,高可擴(kuò)展性,高吞吐量等特征,能夠部署在大規(guī)模廉價的集群上,極大地降低了部署成本。有意思的是,其良好的架構(gòu)特征使其能夠存儲海量的數(shù)據(jù)

HDFS架構(gòu)

        HDFS采用 Master/Slave 架構(gòu)存儲數(shù)據(jù),且支持 NameNode 的 HA。HDFS架構(gòu)主要包含客戶端,NameNodeSecondaryNameNodeDataNode 四個重要組成部分,如圖所示:

Hadoop中HDFS架構(gòu)是怎么樣的

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

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

        (3)客戶端獲取到元數(shù)據(jù)信息后,到相應(yīng)的 DataNode 上讀/寫數(shù)據(jù)

        (4)相關(guān)聯(lián)的 DataNode 之間會相互復(fù)制數(shù)據(jù),以達(dá)到 DataNode 副本數(shù)的要求

        (5)DataNode 會定期向 NameNode 發(fā)送心跳信息,將自身節(jié)點的狀態(tài)信息報告給 NameNode。

        (6)SecondaryNameNode 并不是 NameNode 的備份。SecondaryNameNode 會定期獲取 NameNode 上的 fsimageedits log 日志,并將二者進(jìn)行合并,產(chǎn)生 fsimage.ckpt 推送給 NameNode。

1、NameNode

        NameNode 是整個 Hadooop 集群中至關(guān)重要的組件,它維護(hù)著整個 HDFS 樹,以及文件系統(tǒng)樹中所有的文件和文件路徑的元數(shù)據(jù)信息。這些元數(shù)據(jù)信息包括文件名,命令空間,文件屬性(文件生成的時間、文件的副本數(shù)、文件的權(quán)限)、文件數(shù)據(jù)塊文件數(shù)據(jù)塊與所在 DataNode 之間的映射關(guān)系等。

        一旦 NameNode 宕機(jī)或 NameNode 上的元數(shù)據(jù)信息損壞或丟失,基本上就會丟失 Hadoop 集群中存儲的所有數(shù)據(jù),整個 Hadoop 集群也會隨之癱瘓。

        在 Hadoop 運行的過程中, NameNode 的主要功能如下圖所示:
Hadoop中HDFS架構(gòu)是怎么樣的

2、SecondaryNameNode

        SecondaryNameNode 并不是 NameNode 的備份,在NameNode 發(fā)生故障時也不能立刻接管 NameNode 的工作。SecondaryNameNode 在 Hadoop 運行的過程中具有兩個作用:一個是備份數(shù)據(jù)鏡像,另一個是定期合并日志與鏡像,因此可以稱其為 Hadoop 的檢查點(checkpoint)。SecondaryNameNode 定期合并 NameNode 中的 fsimage 和 edits log,能夠防止 NameNode 重啟時把整個 fsimage 鏡像文件加載到內(nèi)存,耗費過長的啟動時間。

        SecondaryNameNode 的工作流程如圖所示:
Hadoop中HDFS架構(gòu)是怎么樣的        SecondaryNameNode的工作流程如下:

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

        (2)NameNode 生成新的 edits log 日志文件,然后將新的日志信息寫到新生成的 edits log 日志文件中。

        (3)SecondaryNameNode 復(fù)制 NameNode 上的 fsimage 鏡像和 edits log 日志文件,此時使用的是 http get 方式。

        (4)SecondaryNameNodefsimage將鏡像文件加載到內(nèi)存中,然后執(zhí)行 edits log 日志文件中的操作,生成新的鏡像文件 fsimage.ckpt。

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

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

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

        經(jīng)過 SecondaryNameNodefsimage 鏡像文件和 edits log 日志文件的復(fù)制和合并操作之后,NameNode 中的 fsimage 鏡像文件就保存了最新的 checkpoint 的元數(shù)據(jù)信息, edits log 日志文件也會重新寫入數(shù)據(jù),兩個文件中的數(shù)據(jù)不會變得很大。因此,當(dāng)重啟 NameNode 時,不會耗費太長的啟動時間。

        SecondaryNameNode 周期性地進(jìn)行 checkpoint 操作需要滿足一定的前提條件,這些條件如下

        (1)edits log 日志文件的大小達(dá)到了一定的閾值,此時會對其進(jìn)行合并操作。

        (2)每隔一段時間進(jìn)行 checkpoint 操作。

        這些條件可以在core-site.xml文件中進(jìn)行配置和調(diào)整,代碼如下所示:

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

        上述代碼配置了 checkpoint 發(fā)生的時間周期和 edits log日志文件的大小閾值,說明如下。

        (1)fs.checkpoint.period:表示觸發(fā) checkpoint發(fā)生的時間周期,這里配置的時間周期為 1 h。

        (2)fs.checkpoint.size:表示 edits log 日志文件大小達(dá)到了多大的閾值時會發(fā)生 checkpoint操作,這里配置的 edits log大小閾值為 64 MB。

        上述代碼中配置的 checkpoint操作發(fā)生的情況如下:

        (1)如果 edits log 日志文件經(jīng)過 1 h 未能達(dá)到 64 MB,但是滿足了 checkpoint發(fā)生的周期為 1 h 的條件,也會發(fā)生 checkpoint 操作。

        (2)如果 edits log日志文件大小在 1 h 之內(nèi)達(dá)到了 64MB,滿足了 checkpoint 發(fā)生的 edits log日志文件大小閾值的條件,則會發(fā)生 checkpoint操作。

注意:如果 NameNode 發(fā)生故障或 NameNode 上的元數(shù)據(jù)信息丟失或損壞導(dǎo)致 NameNode 無法啟動,此時就需要人工干預(yù),將 NameNode 中的元數(shù)據(jù)狀態(tài)恢復(fù)到 SecondaryNameNode 中的元數(shù)據(jù)狀態(tài)。此時,如果 SecondaryNameNode 上的元數(shù)據(jù)信息與 NameNode 宕機(jī)時的元數(shù)據(jù)信息不同步,則或多或少地會導(dǎo)致 Hadoop 集群中丟失一部分?jǐn)?shù)據(jù)。出于此原因,應(yīng)盡量避免將 NameNode 和 SecondaryNameNode 部署在同一臺服務(wù)器。

3、DataNode

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

        DataNode 運行時的工作機(jī)制如圖所示:

Hadoop中HDFS架構(gòu)是怎么樣的
        如圖所示,DataNode 運行時的工作機(jī)制如下:

        (1)DataNode啟動之后,向 NameNode 注冊。

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

        (3)DataNode 收到 NameNode 返回的注冊成功的信息之后,會周期性地向 NameNode 上報當(dāng)前 DataNode 的所有塊信息,默認(rèn)發(fā)送所有數(shù)據(jù)塊的時間周期是 1h

        (4)DataNode 周期性地向NameNode 發(fā)送心跳信息;NameNode 收到 DataNode 發(fā)來的心跳信息后,會將DataNode 需要執(zhí)行的命令放入到 心跳信息的 返回數(shù)據(jù)中,返回給 DataNode。DataNode 向 NameNode 發(fā)送心跳信息的默認(rèn)時間周期是 3s。

        (5)NameNode 超過一定的時間沒有收到 DataNode 發(fā)來的心跳信息,則 NameNode 會認(rèn)為對應(yīng)的 DataNode 不可用。默認(rèn)的超時時間是 10 min。

        (6)在存儲上相互關(guān)聯(lián)的 DataNode 會同步數(shù)據(jù)塊,以達(dá)到數(shù)據(jù)副本數(shù)的要求。

        當(dāng) DataNode 發(fā)生故障導(dǎo)致 DataNode 無法與 NameNode 通信時,NameNode 不會立即認(rèn)為 DataNode 已經(jīng) “死亡”。要經(jīng)過一段短暫的超時時長后才會認(rèn)為 DataNode 已經(jīng) “死亡”。HDFS 中默認(rèn)的超時時長為 10 min + 30 s,可以用如下公式來表示這個超時時長:

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

        其中,各參數(shù)的含義如下:

        (1)timeout:超時時長。

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

        (3)dfs.heartbeat.interval:檢測數(shù)據(jù)節(jié)點的時間間隔,默認(rèn)的單位為 s,默認(rèn)的時間是 3 s。

        所以,可以得出 DataNode 的默認(rèn)超時時長為 630s,如下所示:

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

        DataNode 的超時時長也可以在 hdfs-site.xml文件中進(jìn)行配置,代碼如下所示:

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

        根據(jù)上面的公式可以得出,在配置文件中配置的超時時長為:

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

        當(dāng) DataNode 被 NameNode 判定為 “死亡”時,HDFS 就會馬上自動進(jìn)行數(shù)據(jù)塊的容錯復(fù)制。此時,當(dāng)被 NameNode 判定為 “死亡” 的 DataNode 重新加入集群中時,如果其存儲的數(shù)據(jù)塊并沒有損壞,就會造成 HDFS 上某些數(shù)據(jù)塊的備份數(shù)超過系統(tǒng)配置的備份數(shù)目。

        HDFS上刪除多余的數(shù)據(jù)塊需要的時間長短和數(shù)據(jù)塊報告的時間間隔有關(guān)。該參數(shù)可以在 hdfs-site.xml文件中進(jìn)行配置,代碼如下所示:

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

        數(shù)據(jù)塊報告的時間間隔默認(rèn)為 21600000ms,即 6h,可以通過調(diào)整此參數(shù)的大小來調(diào)整數(shù)據(jù)塊報告的時間間隔。

以上是“Hadoop中HDFS架構(gòu)是怎么樣的”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI