一.前提及方案
操作版本:社区版 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状态是否存在异常