Secondarynamenode做用
SecondaryNameNode有兩個做用,一是鏡像備份,二是日誌與鏡像的按期合併。兩個過程同時進行,稱爲checkpoint. 鏡像備份的做用:備份fsimage(fsimage是元數據發送檢查點時寫入文件);日誌與鏡像的按期合併的做用:將Namenode中edits日誌和fsimage合併,防止(若是Namenode節點故障,namenode下次啓動的時候,會把fsimage加載到內存中,應用edit log,edit log每每很大,致使操做每每很耗時。)
Secondarynamenode工做原理
日誌與鏡像的按期合併總共分五步:
- SecondaryNameNode通知NameNode準備提交edits文件,此時主節點產生edits.new
- SecondaryNameNode經過http get方式獲取NameNode的fsimage與edits文件(在SecondaryNameNode的current同級目錄下可見到 temp.check-point或者previous-checkpoint目錄,這些目錄中存儲着從namenode拷貝來的鏡像文件)
- SecondaryNameNode開始合併獲取的上述兩個文件,產生一個新的fsimage文件fsimage.ckpt
- SecondaryNameNode用http post方式發送fsimage.ckpt至NameNode
- NameNode將fsimage.ckpt與edits.new文件分別重命名爲fsimage與edits,而後更新fstime,整個checkpoint過程到此結束。 在新版本的hadoop中(hadoop0.21.0),SecondaryNameNode兩個做用被兩個節點替換, checkpoint node與backup node. SecondaryNameNode備份由三個參數控制fs.checkpoint.period控制週期,fs.checkpoint.size控制日誌文件超過多少大小時合併, dfs.http.address表示http地址,這個參數在SecondaryNameNode爲單獨節點時須要設置。
相關配置文件
core-site.xml:這裏有2個參數可配置,但通常來講咱們不作修改。fs.checkpoint.period表示多長時間記錄一次hdfs的鏡像。默認是1小時。fs.checkpoint.size表示一次記錄多大的size,默認64M。
<property><name>fs.checkpoint.period</name> <value>3600</value> <description>The number of seconds between two periodic checkpoints. </description> </property>
<property> <name>fs.checkpoint.size</name> <value>67108864</value> <description>The size of the current edit log (in bytes) that triggers a periodic checkpoint even if the fs.checkpoint.period hasn’t expired. </description> </property> |
鏡像備份的週期時間是能夠修改的,若是不想一個小時備份一次,能夠改的時間短點。core-site.xml中的fs.checkpoint.period值
Secondarynamenode工做原理圖
這也解釋了下面的問題:
(1)、爲何namenode和Secondary namenode須要一樣大內存
(2)、大集羣中namenode和Secondary namenode須要是各自獨立的兩個節點。
Checkpoint的日誌信息
2011-07-19 23:59:28,435 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Number of transactions: 0 Total time for transactions(ms): 0Number of transactions batched in Syncs: 0 Number of syncs: 0 SyncTimes(ms): 02011-07-19 23:59:28,472 INFO org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Downloaded file fsimage size 548 bytes. 2011-07-19 23:59:28,473 INFO org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Downloaded file edits size 631 bytes. 2011-07-19 23:59:28,486 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: fsOwner=hadadm,hadgrp 2011-07-19 23:59:28,486 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: supergroup=supergroup 2011-07-19 23:59:28,486 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: isPermissionEnabled=true 2011-07-19 23:59:28,488 INFO org.apache.hadoop.hdfs.server.common.Storage: Number of files = 6 2011-07-19 23:59:28,489 INFO org.apache.hadoop.hdfs.server.common.Storage: Number of files under construction = 0 2011-07-19 23:59:28,490 INFO org.apache.hadoop.hdfs.server.common.Storage: Edits file /home/hadadm/clusterdir/tmp/dfs/namesecondary/current/edits of size 631 edits # 6 loaded in 0 seconds. 2011-07-19 23:59:28,493 INFO org.apache.hadoop.hdfs.server.common.Storage: Image file of size 831 saved in 0 seconds. 2011-07-19 23:59:28,513 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Number of transactions: 0 Total time for transactions(ms): 0Number of transactions batched in Syncs: 0 Number of syncs: 0 SyncTimes(ms): 0 2011-07-19 23:59:28,543 INFO org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Posted URL master:50070putimage=1&port=50090&machine=10.253.74.234&token=-18:1766583108:0:1311091168000:1311087567797 2011-07-19 23:59:28,561 WARN org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Checkpoint done. New Image Size: 831 |
Namenode/Secondarynamenode文件結構
[hadadm@slave /home/hadadm/clusterdir/tmp/dfs/namesecondary/current]$ ll 總用量 24 drwxr-xr-x 2 hadadm hadgrp 4096 7月 19 22:59 ./ drwxr-xr-x 5 hadadm hadgrp 4096 7月 19 23:59 ../ -rw-r–r– 1 hadadm hadgrp 4 7月 19 23:59 edits -rw-r–r– 1 hadadm hadgrp 548 7月 19 22:59 fsimage -rw-r–r– 1 hadadm hadgrp 8 7月 19 22:59 fstime -rw-r–r– 1 hadadm hadgrp 101 7月 19 22:59 VERSION
[hadadm@slave /home/hadadm/clusterdir/tmp/dfs/namesecondary/current] $ cat VERSION #Tue Jul 19 22:59:27 CST 2011 namespaceID=1766583108 cTime=0 storageType=NAME_NODE layoutVersion=-18 推這裏VERSION表示的是secondarynamenode中的fsimage版本是22:59時的;加上edits應用的日誌就能夠到23:59 |
[hadadm@master /home/hadadm/clusterdir/dfs/name/current]$ ls -l 總用量 16 -rw-r–r– 1 hadadm hadgrp 4 7月 19 23:59 edits -rw-r–r– 1 hadadm hadgrp 831 7月 19 23:59 fsimage -rw-r–r– 1 hadadm hadgrp 8 7月 19 23:59 fstime -rw-r–r– 1 hadadm hadgrp 101 7月 19 23:59 VERSION
[hadadm@master /home/hadadm/clusterdir/dfs/name/current] $ cat VERSION #Tue Jul 19 23:59:28 CST 2011 namespaceID=1766583108 cTime=0 storageType=NAME_NODE layoutVersion=-18 這裏VERSION表示的是namenode中的fsimage版本是23:59時的; edits應用沒有變動 這裏的fsimage至關於secondarynamenode裏面的fsimage+edits |
[hadadm@slave /home/hadadm/clusterdir/tmp/dfs/namesecondary]$ ls -l 總用量 12 drwxr-xr-x 2 hadadm hadgrp 4096 7月 19 23:59 current drwxr-xr-x 2 hadadm hadgrp 4096 7月 19 22:59 image -rw-r–r– 1 hadadm hadgrp 0 7月 19 23:59 in_use.lock drwxr-xr-x 2 hadadm hadgrp 4096 7月 19 22:59 previous.checkpoint
[hadadm@slavea /home/hadadm/clusterdir/tmp/dfs/namesecondary] $ ls -l previous.checkpoint/ 總用量 16 -rw-r–r– 1 hadadm hadgrp 4 7月 19 23:59 edits -rw-r–r– 1 hadadm hadgrp 548 7月 19 22:59 fsimage -rw-r–r– 1 hadadm hadgrp 8 7月 19 22:59 fstime -rw-r–r– 1 hadadm hadgrp 101 7月 19 22:59 VERSION 這裏上一個檢查點的數據是能夠用來恢復數據的 |
Import Checkpoint(恢復數據)
若是主節點namenode掛掉了,硬盤數據須要時間恢復或者不能恢復了,如今又想馬上恢復HDFS,這個時候就能夠import checkpoint。步驟以下:
- 準備原來機器同樣的機器,包括配置和文件
- 建立一個空的文件夾,該文件夾就是配置文件中dfs.name.dir所指向的文件夾。
- 拷貝你的secondary NameNode checkpoint出來的文件,到某個文件夾,該文件夾爲fs.checkpoint.dir指向的文件夾(例如:/home/hadadm/clusterdir/tmp/dfs/namesecondary)
- 執行命令bin/hadoop namenode –importCheckpoint
- 這樣NameNode會讀取checkpoint文件,保存到dfs.name.dir。可是若是你的dfs.name.dir包含合法的 fsimage,是會執行失敗的。由於NameNode會檢查fs.checkpoint.dir目錄下鏡像的一致性,可是不會去改動它。
通常建議給maste配置多臺機器,讓namesecondary與namenode不在同一臺機器上值得推薦的是,你要注意備份你的dfs.name.dir和 ${hadoop.tmp.dir}/dfs/namesecondary。
後續版本中的backupnode
Checkpoint Node 和 Backup Node在後續版本中hadoop-0.21.0,還提供了另外的方法來作checkpoint:Checkpoint Node 和 Backup Node。則兩種方式要比secondary NameNode好不少。因此 The Secondary NameNode has been deprecated. Instead, consider using the Checkpoint Node or Backup Node. Checkpoint Node像是secondary NameNode的改進替代版,Backup Node提供更大的便利,這裏就再也不介紹了。
BackupNode : 備份結點。這個結點的模式有點像 mysql 中的主從結點複製功能, NN 能夠實時的將日誌傳送給 BN ,而 SNN 是每隔一段時間去 NN 下載 fsimage 和 edits 文件,而 BN 是實時的獲得操做日誌,而後將操做合併到 fsimage 裏。在 NN 裏提供了二個日誌流接口: EditLogOutputStream 和 EditLogInputStream 。即當 NN 有日誌時,不只會寫一份到本地 edits 的日誌文件,同時會向 BN 的網絡流中寫一份,當流緩衝達到閥值時,將會寫入到 BN 結點上, BN 收到後就會進行合併操做,這樣來完成低延遲的日誌複製功能。 總結: 當前的備份結點都是冷備份,因此還須要實現熱備份,使得 NN 掛了後,從結點自動的升爲主結點來提供服務。 主 NN 的效率問題: NN 的文件過多致使內存消耗問題, NN 中文件鎖問題, NN 的啓動時間。 |
由於Secondarynamenaode不是實施備份和同步,因此SNN會丟掉當前namenode的edit log數據,應該來講backupnode能夠解決這個問題