個人小站,正在持續整理中,歡迎訪問:http://shitouer.cn
小站博文地址:Hadoop遷移Namenode
一.前提及方案
操作版本:社區版 Hadoop-1.0.3,其他版本不保證
之前HBase沒有考慮壓縮,經過一段時間的研究和測試,打算在HBase中全面采用snappy壓縮庫。但是在節點上配置snappy時,發現其要求glibc版本在2.5+,而當前系統CentOS-4.8的glibc是2.3.4,CentOS-4.8不支持獨立升級glibc到2.5+,所以只能整個集群升級系統到CentOS5。逐台升級,這就牽扯到Namenode節點也要升級,這就需要在不丟失數據的情況下將Namenode遷移到其他服務器,特在此記錄操作流程,供后續參考。
因為集群初始時沒有設置SecondaryNamenode,一開始考慮覺得還挺困難,但是后來仔細一想,其實Hadoop集群是“機器不相關”(或者IP不相關?)的,無論是那台機器做Namenode,只要配置指向該節點,且該節點文件路徑與原Namenode一致,則其他Datanode節點就應該會很傻很天真的以為它就是Namenode節點。
二. edits和fsimage介紹
集群NameNode把文件系統(HDFS)的變化追加保存到日志文件edits中。
當NameNode啟動時,會從鏡像文件 fsimage 中讀取HDFS的狀態,並且把edits文件中記錄的操作應用到fsimage,也就是合並到fsimage中去。合並后更新fsimage的HDFS狀態,創建一個新的edits文件來記錄文件系統的變化。
與此相關的主要文件存儲位置在hdfs-site.xml中設置 :
<property> <name>dfs.name.dir</name> <value>/data1/hadoopdata1/dfs/name,/data1/hadoopdata2/dfs/name</value> </property>
三. 具體操作步驟
1. 停掉Hadoop及相關集群
2. 備份dfs.name.dir所指向的目錄及文件
3. 修改$HADOOP_HOME/conf/下配置文件
- 修改core-site.xml中fs.default.name,將原hostname改為新主機hostname
- 修改mapred-site.xml中mapred.job.tracker,將原hostname改為新主機hostname
- 檢查slaves文件和master文件(因為很多時候是從原集群中剝離一台機器,所以要特別注意是否有遺漏)
- 修改其他相關配置文件的配置(如有HBase,需要修改hbase-site.xml中hbase.rootdir等,所以盡量仔細檢查各個配置文件)
4. 建立新Namenode到其自身及其他Datanode節點間的互信
5. 將第2步中備份的文件拷貝到新Namenode節點,且按照原Namenode文件結構放置文件
6. 將第3步中修改后的配置文件分發到其他Datanode節點
7. 啟動HDFS,查看NameNode、SecondaryNameNode和各個DataNode狀態是否正常
8. 啟動MapReduce,查看TaskTracker、ZooKeeper、RegionServer狀態是否存在異常