HDFS是一個(gè)分布式文件存儲系統(tǒng),文件分布式存儲在多個(gè)DataNode節(jié)點(diǎn)上披坏。一個(gè)文件存儲在哪些DataNode節(jié)點(diǎn)的哪些位置的元數(shù)據(jù)信息(metadata)由NameNode節(jié)點(diǎn)來處理句灌。隨著存儲文件的增多重慢,NameNode上存儲的信息也會越來越多怪与。那么HDFS是如何及時(shí)更新這些metadata的呢樊破?
在HDFS中主要是通過兩個(gè)組件FSImage和EditsLog來實(shí)現(xiàn)metadata的更新缕探。在某次啟動HDFS時(shí)魂莫,會從FSImage文件中讀取當(dāng)前HDFS文件的metadata,之后對HDFS的操作步驟都會記錄到edit log文件中爹耗。比如下面這個(gè)操作過程:
那么完整的metadata信息就應(yīng)該由FSImage文件和edit log文件組成耙考。fsimage中存儲的信息就相當(dāng)于整個(gè)hdfs在某一時(shí)刻的一個(gè)快照。
FSImage文件和EditsLog文件可以通過ID來互相關(guān)聯(lián)潭兽。在參數(shù)dfs.namenode.name.dir設(shè)置的路徑下倦始,會保存FSImage文件和EditsLog文件,如果是QJM方式HA的話山卦,EditsLog文件保存在參數(shù)dfs.journalnode.edits.dir設(shè)置的路徑下鞋邑。
? ?在上圖中可以看到,edit log文件以edits_開頭账蓉,后面跟一個(gè)txid范圍段枚碗,并且多個(gè)edit?log之間首尾相連,正在使用的edit log名字為edits_inprogress_txid铸本。該路徑下還會保存兩個(gè)fsimage文件肮雨,文件格式為fsimage_txid。上圖中可以看出fsimage文件已經(jīng)加載到了最新的一個(gè)edit log文件箱玷,僅僅只有inprogress狀態(tài)的edit log未被加載怨规。在啟動HDFS時(shí),只需要讀入fsimage_0000000000000008927以及edits_inprogress_0000000000000008928就可以還原出當(dāng)前hdfs的最新狀況锡足。?
但是這里又會出現(xiàn)一個(gè)問題波丰,如果edit log文件越來越多、越來越大時(shí)舶得,當(dāng)重新啟動hdfs時(shí)掰烟,由于需要加載fsimage后再把所有的edit log也加載進(jìn)來,就會出現(xiàn)第一段中出現(xiàn)的問題了。怎么解決媚赖?HDFS會采用checkpoing機(jī)制定期將edit log合并到fsimage中生成新的fsimage。這個(gè)過程就是接下來要講的了珠插。
Checkpoint機(jī)制
fsimage和edit log合并的過程如下圖所示:
其實(shí)這個(gè)合并過程是一個(gè)很耗I/O與CPU的操作惧磺,并且在進(jìn)行合并的過程中肯定也會有其他應(yīng)用繼續(xù)訪問和修改hdfs文件。所以捻撑,這個(gè)過程一般不是在單一的NameNode節(jié)點(diǎn)上進(jìn)行從磨隘。如果HDFS沒有做HA的話,checkpoint由SecondNameNode進(jìn)程(一般SecondNameNode單獨(dú)起在另一臺機(jī)器上)來進(jìn)行顾患。在HA模式下番捂,checkpoint則由StandBy狀態(tài)的NameNode來進(jìn)行。
什么時(shí)候進(jìn)行checkpoint由參數(shù)dfs.namenode.checkpoint.preiod(默認(rèn)值是3600江解,即1小時(shí))和dfs.namenode.checkpoint.txns(默認(rèn)值是1000000)來決定设预。period參數(shù)表示,經(jīng)過1小時(shí)就進(jìn)行一次checkpoint犁河,txns參數(shù)表示鳖枕,hdfs經(jīng)過100萬次操作后就要進(jìn)行checkpoint了。這兩個(gè)參數(shù)任意一個(gè)得到滿足桨螺,都會觸發(fā)checkpoint過程宾符。進(jìn)行checkpoint的節(jié)點(diǎn)每隔dfs.namenode.checkpoint.check.period(默認(rèn)值是60)秒就會去統(tǒng)計(jì)一次hdfs的操作次數(shù)。
HA模式下Checkpointing過程分析
在HA模式下checkpoint過程由StandBy NameNode來進(jìn)行灭翔,以下簡稱為SBNN魏烫,Active NameNode簡稱為ANN。
HA模式下的edit log文件會同時(shí)寫入多個(gè)JournalNodes節(jié)點(diǎn)的dfs.journalnode.edits.dir路徑下肝箱,JournalNodes的個(gè)數(shù)為大于1的奇數(shù)哄褒,類似于Zookeeper的節(jié)點(diǎn)數(shù),當(dāng)有不超過一半的JournalNodes出現(xiàn)故障時(shí)狭园,仍然能保證集群的穩(wěn)定運(yùn)行读处。
SBNN會讀取FSImage文件中的內(nèi)容,并且每隔一段時(shí)間就會把ANN寫入edit log中的記錄讀取出來唱矛,這樣SBNN的NameNode進(jìn)程中一直保持著hdfs文件系統(tǒng)的最新狀況namespace罚舱。當(dāng)達(dá)到checkpoint條件的某一個(gè)時(shí),就會直接將該信息寫入一個(gè)新的FSImage文件中绎谦,然后通過HTTP傳輸給ANN管闷。
如上圖所示,主要由4個(gè)步驟:
1. SBNN檢查是否達(dá)到checkpoint條件:離上一次checkpoint操作是否已經(jīng)有一個(gè)小時(shí)窃肠,或者HDFS已經(jīng)進(jìn)行了100萬次操作包个。
2. SBNN檢查達(dá)到checkpoint條件后,將該namespace以fsimage.ckpt_txid格式保存到SBNN的磁盤上,并且隨之生成一個(gè)MD5文件碧囊。然后將該fsimage.ckpt_txid文件重命名為fsimage_txid树灶。
3. 然后SBNN通過HTTP聯(lián)系A(chǔ)NN。
4. ANN通過HTTP從SBNN獲取最新的fsimage_txid文件并保存為fsimage.ckpt_txid糯而,然后也生成一個(gè)MD5天通,將這個(gè)MD5與SBNN的MD5文件進(jìn)行比較,確認(rèn)ANN已經(jīng)正確獲取到了SBNN最新的fsimage文件熄驼。然后將fsimage.ckpt_txid文件重命名為fsimage_txit像寒。
通過上面一系列的操作,SBNN上最新的FSImage文件就成功同步到了ANN上瓜贾。