一.前提及方案
操作版本:社區版
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狀態是否存在異常
相關閱讀: Hive遷移Hadoop namenode時遇到的問題
http://www.linuxidc.com/Linux/2012-07/66770.htm
http://www.linuxidc.com/Linux/2013-08/88956.htm