前言
最近剛接觸Hadoop, 一直沒有弄明白NameNode和Secondary NameNode的區(qū)別和關系潭陪。很多人都認為,Secondary NameNode是NameNode的備份最蕾,是為了防止NameNode的單點失敗的依溯,直到讀了這篇文章Secondary Namenode - What it really do? (需翻墻)才發(fā)現(xiàn)并不是這樣。文章寫的很通俗易懂瘟则,現(xiàn)將其翻譯如下:
Secondary NameNode:它究竟有什么作用黎炉?
在Hadoop中,有一些命名不好的模塊醋拧,Secondary NameNode是其中之一慷嗜。從它的名字上看,它給人的感覺就像是NameNode的備份丹壕。但它實際上卻不是庆械。很多Hadoop的初學者都很疑惑,Secondary NameNode究竟是做什么的菌赖,而且它為什么會出現(xiàn)在HDFS中缭乘。因此,在這篇文章中琉用,我想要解釋下Secondary NameNode在HDFS中所扮演的角色堕绩。
從它的名字來看,你可能認為它跟NameNode有點關系邑时。沒錯逛尚,你猜對了。因此在我們深入了解Secondary NameNode之前刁愿,我們先來看看NameNode是做什么的。
NameNode
NameNode主要是用來保存HDFS的元數(shù)據(jù)信息到逊,比如命名空間信息铣口,塊信息等。當它運行的時候觉壶,這些信息是存在內(nèi)存中的脑题。但是這些信息也可以持久化到磁盤上。
上面的這張圖片展示了NameNode怎么把元數(shù)據(jù)保存到磁盤上的铜靶。這里有兩個不同的文件:
- fsimage - 它是在NameNode啟動時對整個文件系統(tǒng)的快照
- edit logs - 它是在NameNode啟動后叔遂,對文件系統(tǒng)的改動序列
只有在NameNode重啟時他炊,edit logs才會合并到fsimage文件中,從而得到一個文件系統(tǒng)的最新快照已艰。但是在產(chǎn)品集群中NameNode是很少重啟的痊末,這也意味著當NameNode運行了很長時間后,edit logs文件會變得很大哩掺。在這種情況下就會出現(xiàn)下面一些問題:
- edit logs文件會變的很大凿叠,怎么去管理這個文件是一個挑戰(zhàn)。
- NameNode的重啟會花費很長時間嚼吞,因為有很多改動[筆者注:在edit logs中]要合并到fsimage文件上盒件。
- 如果NameNode掛掉了,那我們就丟失了很多改動因為此時的fsimage文件非常舊舱禽。[筆者注: 筆者認為在這個情況下丟失的改動不會很多, 因為丟失的改動應該是還在內(nèi)存中但是沒有寫到edit logs的這部分炒刁。]
因此為了克服這個問題,我們需要一個易于管理的機制來幫助我們減小edit logs文件的大小和得到一個最新的fsimage文件誊稚,這樣也會減小在NameNode上的壓力翔始。這跟Windows的恢復點是非常像的,Windows的恢復點機制允許我們對OS進行快照片吊,這樣當系統(tǒng)發(fā)生問題時绽昏,我們能夠回滾到最新的一次恢復點上。
現(xiàn)在我們明白了NameNode的功能和所面臨的挑戰(zhàn) - 保持文件系統(tǒng)最新的元數(shù)據(jù)俏脊。那么全谤,這些跟Secondary NameNode又有什么關系呢?
Secondary NameNode
SecondaryNameNode就是來幫助解決上述問題的爷贫,它的職責是合并NameNode的edit logs到fsimage文件中认然。
上面的圖片展示了Secondary NameNode是怎么工作的。
- 首先漫萄,它定時到NameNode去獲取edit logs卷员,并更新到fsimage上。[筆者注:Secondary NameNode自己的fsimage]
- 一旦它有了新的fsimage文件腾务,它將其拷貝回NameNode中毕骡。
- NameNode在下次重啟時會使用這個新的fsimage文件,從而減少重啟的時間岩瘦。
Secondary NameNode的整個目的是在HDFS中提供一個檢查點未巫。它只是NameNode的一個助手節(jié)點。這也是它在社區(qū)內(nèi)被認為是檢查點節(jié)點的原因启昧。
現(xiàn)在叙凡,我們明白了Secondary NameNode所做的不過是在文件系統(tǒng)中設置一個檢查點來幫助NameNode更好的工作。它不是要取代掉NameNode也不是NameNode的備份密末。所以從現(xiàn)在起握爷,讓我們養(yǎng)成一個習慣跛璧,稱呼它為檢查點節(jié)點吧。
后記
這篇文章基本上已經(jīng)清楚的介紹了Secondary NameNode的工作以及為什么要這么做新啼。最后補充一點細節(jié)追城,是關于NameNode是什么時候將改動寫到edit logs中的?這個操作實際上是由DataNode的寫操作觸發(fā)的师抄,當我們往DataNode寫文件時漓柑,DataNode會跟NameNode通信,告訴NameNode什么文件的第幾個block放在它那里叨吮,NameNode這個時候會將這些元數(shù)據(jù)信息寫到edit logs文件中辆布。