天天看點

NameNode (NN) 和 SecondayNameNode (2NN) 的工作機制

NameNode (NN) 和 SecondayNameNode (2NN) 的工作機制

首先,我們需要思考NameNode中的中繼資料是存儲在什麼中?是記憶體中還是磁盤中呢?顯然如果隻存在記憶體中的話,一旦斷電,元素據就丢失了,整個叢集就無法工作。如果存在NN節點的磁盤中話,因為需要進行随機通路,還要響應客戶請求,效率必然會很低。是以中繼資料在記憶體上工作的同時,會在磁盤中備份中繼資料的一個鏡像 FsImage,這樣既能保證高效的工作,又能保證資料的安全。但是這樣的話又會帶來新的問題,我們不妨想象一下記憶體中的中繼資料如果在頻繁的更新,那我們的FsImage也會同時更新嗎?這時效率很低的。如果不更新,那這個備份就沒有意義了,一旦斷電,中繼資料仍然會丢失。是以我們在這裡引入了Edits檔案,修改日志。那麼修改日志又承擔了怎樣的責任呢。每當中繼資料有更新或者添加中繼資料時,修改記憶體中的中繼資料并追加到Edits中,隻進行追加操作,效率很高。也就是說Edits檔案會記錄記憶體中的中繼資料是如何變化的。這樣,一旦NameNode節點斷電,可以通過FsImage和Edits的合并,合成中繼資料。如果NN自己負責合成的話,任然會導緻效率很低,是以這時後2NN就會登場,Edits和FsImage都會拷貝到2NN中,2NN負責合成 (所謂合并,就是将Edits和Fsimage加載到記憶體中,照着Edits中的操作一步步執行,最終形成新的Fsimage)。

Fsimage:NameNode記憶體中中繼資料序列化後形成的檔案。

Edits:記錄用戶端更新中繼資料資訊的每一步操作(可通過Edits運算出中繼資料)。

NameNode啟動時,先滾動Edits并生成一個空的edits.inprogress,然後加載Edits和Fsimage到記憶體中,此時NameNode記憶體就持有最新的中繼資料資訊。Client開始對NameNode發送中繼資料的增删改的請求,這些請求的操作首先會被記錄到edits.inprogress中(查詢中繼資料的操作不會被記錄在Edits中,因為查詢操作不會更改中繼資料資訊),如果此時NameNode挂掉,重新開機後會從Edits中讀取中繼資料的資訊。然後,NameNode會在記憶體中執行中繼資料的增删改的操作。

由于Edits中記錄的操作會越來越多,Edits檔案會越來越大,導緻NameNode在啟動加載Edits時會很慢,是以需要對Edits和Fsimage進行合并(所謂合并,就是将Edits和Fsimage加載到記憶體中,照着Edits中的操作一步步執行,最終形成新的Fsimage)。SecondaryNameNode的作用就是幫助NameNode進行Edits和Fsimage的合并工作。

SecondaryNameNode首先會詢問NameNode是否需要CheckPoint(觸發CheckPoint需要滿足兩個條件中的任意一個,定時時間到和Edits中資料寫滿了)。直接帶回NameNode是否檢查結果。SecondaryNameNode執行CheckPoint操作,首先會讓NameNode滾動Edits并生成一個空的edits.inprogress,滾動Edits的目的是給Edits打個标記,以後所有新的操作都寫入edits.inprogress,其他未合并的Edits和Fsimage會拷貝到SecondaryNameNode的本地,然後将拷貝的Edits和Fsimage加載到記憶體中進行合并,生成fsimage.chkpoint,然後将fsimage.chkpoint拷貝給NameNode,重命名為Fsimage後替換掉原來的Fsimage。NameNode在啟動時就隻需要加載之前未合并的Edits和Fsimage即可,因為合并過的Edits中的中繼資料資訊已經被記錄在Fsimage中。

2.叢集的安全模式

叢集的安全模式,就是在在叢集啟動時的一個保護機制。叢集啟動時主要涉及到 NameNode 和 DataNode。叢集處于安全模式,不能執行重要操作(寫操作)。叢集啟動完成後,自動退出安全模式。

NameNode啟動時,首先會将Fsimage載入記憶體,并執行Edits中各項操作 (確定載入記憶體的是最新的中繼資料,因為可能沒達到checkpoint的Edits和Fsimage還沒有傳入到2NN,是以用自己存在磁盤中的最新的 ),隻有到達checkpoint以後,一份完整的Fsiamge和Edits才會傳入2NN。一旦在記憶體中成功建立檔案系統的中繼資料映像,則建立一個新的Fsimage檔案和一個空的編輯日志。此是NameNode開始監聽DataNode請求。這個過程期間,NameNode一直運作在安全模式中,NameNode的檔案系統對于用戶端來說隻能讀和下載下傳不能修改。

當DataNode啟動時,NameNode才能通過DataNode的回報得到我們存儲的資料的資訊。因為資料是以資料塊的形式存儲在DataNode中的。隻能當DataNode啟動後,才能對資料進行修改操作。

當DataNode向NameNode回報時,如果發現丢失超過兩個資料塊,安全模式則無法自動退出。如果滿足“最小副本條件”,NameNode會在30秒鐘之後就退出安全模式。所謂的最小副本條件指的是在整個檔案系統中99.9%的塊滿足最小副本級别。在啟動一個剛剛格式化的HDFS叢集時,因為系統中還沒有任何塊,是以NameNode不會進入安全模式。

(1)bin/hdfs dfsadmin -safemode get (功能描述:檢視安全模式狀态)

(2)bin/hdfs dfsadmin -safemode enter (功能描述:進入安全模式狀态)

(3)bin/hdfs dfsadmin -safemode leave (功能描述:離開安全模式狀态)

(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式狀态)

3.NameNode多目錄配置

NameNode 的本地目錄可以配置成多個,且每個目錄存放的内容相同,增加可靠性。注意每個目錄存放的内容相同。 DataNode也可以配置多個目錄,且每個目錄存放的内容不同。每個目錄存儲的資料不一樣。即:資料不是副本

4.DataNode的工作機制

一個資料塊在DataNode上以檔案的形式存儲在磁盤上,包括兩個檔案,一個時是資料本身,一個是中繼資料包括資料塊的長度,塊資料的校驗和,以及時間戳。-------(資料檔案,校驗檔案,時間戳)校驗資料的完整性。

DateNode啟動後回向NameNode注冊,通過後,每1個小時的向NameNode上報所有的塊信(DateNode在啟動時會立即向NameNode彙報一次資料塊資訊。用來确定安全模式的退出)。

心跳每3秒一次,心跳傳回結果帶有NameNode給DataNode的指令(比如删除,複制資料塊),如果超過10分30秒沒有收到某個DataNode的心跳,則認為該結點不可用。

5.資料完整性

當DataNode收到用戶端請求通路資料以後。DataNode在讀取Block資料塊時,會計算CheckSum,當計算後的值如Block建立時的值不一樣,則會認為Block已經損壞,Client讀取其他DataNode上的Block。

也就是說,當用戶端請求通路資料塊是,DataNode會檢視Block是否完整,完整後再傳回。

通過crc校驗算法檢查其完整性。

6.服役新節點

1)需求

随着公司業務的增長,資料量越來越大,原有的資料節點的容量已經不能滿足存儲資料的需求,需要在原有叢集基礎上動态添加新的資料節點。

2)環境準備

(1)在hadoop104主機上再克隆一台hadoop105主機

(2)修改IP位址和主機名稱

(3)删除原來HDFS檔案系統留存的檔案(/opt/module/hadoop-3.1.3/data和logs)

(4)source一下配置檔案

克隆-------修改主機名和IP------删除克隆機的logs和data檔案----source配置檔案

source配置檔案:source /etc/profile

單點啟動:hdfs -daemon start datanode

​ yarn -daemon start nodemanager

7.退役舊節點

添加白名單和黑名單

白名單和黑名單是hadoop管理叢集主機的一種機制。

添加到白名單的主機節點,都允許通路NameNode,不在白名單的主機節點,都會被退出。

添加到黑名單的主機節點,不允許通路NameNode,會在資料遷移後退出。

實際情況下,白名單用于确定允許通路NameNode的DataNode節點,内容配置一般與workers檔案内容一緻。 黑名單用于在叢集運作過程中退役DataNode節點。

配置白名單和黑名單的具體步驟如下:

1)在NameNode節點的/opt/module/hadoop-3.1.3/etc/hadoop目錄下分别建立whitelist 和 blacklist檔案,touch whitelist, touch blacklist

在whitelist中添加如下主機名稱,假如叢集正常工作的節點為102 103 104 105

hadoop102

hadoop103

hadoop104

hadoop105

2)在hdfs-site.xml配置檔案中增加dfs.hosts和 dfs.hosts.exclude配置參數

dfs.hosts

/opt/module/hadoop-3.1.3/etc/hadoop/whitelist

dfs.hosts.exclude

/opt/module/hadoop-3.1.3/etc/hadoop/blacklist

分發配置檔案whitelist,blacklist,hdfs-site.xml (注意:105節點也要發一份)

3)分發配置檔案whitelist,blacklist,hdfs-site.xml (注意:105節點也要發一份)

[[email protected] etc]$ xsync hadoop/

[[email protected] etc]$ rsync -av hadoop/ [email protected]:/opt/module/hadoop-3.1.3/etc/hadoop/

重新啟動叢集(注意:105節點沒有添加到workers,是以要單獨起停)

hdfs –daemon start datanode

繼續閱讀