最近有朋友問我secondary
namenode的作用,是不是namenode的備份?是不是為了防止namenode的單點問題?确實,剛接觸hadoop,從字面上看,很容易會把
secondary
namenode當作備份節點;其實,這是一個誤區,我們不能從字面來了解,閱讀官方文檔,我們可以知道,其實并不是這麼回事,下面就來贅述下
secondary namenode的作用。
在hadoop中,有一些命名子產品不那麼盡人意,secondary
namenode就是一個典型的例子之一。從它的名字上看,它給人的感覺就像是namenode的備份節點,但實際上卻不是。很多hadoop的入門者都
很疑惑,secondary namenode究竟在其中起什麼作用,它在hdfs中所扮演的角色是什麼。下面,我就來解釋下:
從名字來看,它确實與namenode有點關系;是以,在深入了解secondary namenode之前,我們先來看看namenode是做什麼的。
namenode主要是用來儲存hdfs的中繼資料資訊,比如命名空間資訊,塊資訊等等。當它運作的時候,這些資訊是存在記憶體中的。但是這些資訊也可以持久化到磁盤上。如下圖所示:
上圖展示來namenode怎麼把中繼資料儲存到磁盤上,這裡有兩個不同的檔案:
fsimage:它是namenode啟動時對整個檔案系統的快照。
edits:它是在namenode啟動後,對檔案系統的改動序列。
隻有在namenode重新開機時,edits才會合并到fsimage檔案中,進而得到一個檔案系統的最新快照。但是在生産環境叢集中的
namenode是很少重新開機的,這意味者當namenode運作來很長時間後,edits檔案會變的很大。在這種情況下就會出現下面這些問題:
edits檔案會變的很大,如何去管理這個檔案?
namenode的重新開機會花費很長的時間,因為有很多改動要合并到fsimage檔案上。
如果namenode宕掉了,那我們就丢失了很多改動,因為此時的fsimage檔案時間戳比較舊。
是以為了克服這個問題,我們需要一個易于管理的機制來幫助我們減小edits檔案的大小和得到一個最新的fsimage檔案,這樣也會減小在
namenode上的壓力。而secondary
namenode就是為了幫助解決上述問題提出的,它的職責是合并namenode的edits到fsimage檔案中。如圖所示:
上圖的工作原理,我這裡也贅述下:
首先,它定時到namenode去擷取edits,并更新到fsimage上。
一旦它有新的fsimage檔案,它将其拷貝回namenode上。
namenode在下次重新開機時回使用這個新的fsimage檔案,進而減少重新開機的時間。
secondary namenode的整個目的在hdfs中提供一個checkpoint node,通過閱讀官方文檔可以清晰的知道,它隻是namenode的一個助手節點,這也是它在社群内被認為是checkpoint node的原因。
現在,我們明白secondary namenode所做的是在檔案系統這設定一個checkpoint來幫助namenode更好的工作;它不是取代namenode,也不是namenode的備份。
secondary namenode的檢查點程序啟動,是由兩個配置參數控制的:
fs.checkpoint.period,指定連續兩次檢查點的最大時間間隔, 預設值是1小時。
fs.checkpoint.size定義了edits日志檔案的最大值,一旦超過這個值會導緻強制執行檢查點(即使沒到檢查點的最大時間間隔)。預設值是64mb。
如果namenode上除了最新的檢查點以外,所有的其他的曆史鏡像和edits檔案都丢失了, namenode可以引入這個最新的檢查點。以下操作可以實作這個功能:
在配置參數dfs.name.dir指定的位置建立一個空檔案夾;
把檢查點目錄的位置指派給配置參數fs.checkpoint.dir;
啟動namenode,并加上-importcheckpoint。
namenode會從fs.checkpoint.dir目錄讀取檢查點,并把它儲存在dfs.name.dir目錄下。如果
dfs.name.dir目錄下有合法的鏡像檔案,namenode會啟動失敗。
namenode會檢查fs.checkpoint.dir目錄下鏡像檔案的一緻性,但是不會去改動它。
注:關于namenode是什麼時候将改動寫到edit
logs中的?這個操作實際上是由datanode的寫操作觸發的,當我們往datanode寫檔案時,datanode會跟namenode通信,告訴
namenode什麼檔案的第幾個block放在它那裡,namenode這個時候會将這些中繼資料資訊寫到edit logs檔案中。
下面附上官方文檔說明:
這篇文章就和大家分享到這裡,若在閱讀過程中有什麼疑問,可以加群進行讨論或發送郵件給我,我會盡我所能為您解答,與君共勉!