Step 1: 做下saveNamespace操作,停掉集群,并备份下 HDFS 的 Metadata
1.1 让namenode进入safe mode状态
$ bin/hadoop dfsadmin -safemode enter
1.2 执行saveNamespace操作
$ bin/hadoop dfsadmin -saveNamespace
1.3 stop 集群
1.4 备份 dfs.name.dir 下面的元数据
Step 2: 下载 CDH4,把CDH3的配置拷过来
注意CDH3配置文件是在conf目录下面,CDH4的配置文件目录已经改成了etc/hadoop目录
Step 3: 升级 HDFS Metadata
3.1 进入CDH4目录下执行:
sbin/hadoop-daemon.sh start namenode -upgrade -clusterid mycluster-test
说明mycluster-test是clusterid,可以指定,也可以不指定,如果不指定那么系统会自动生成一个
3.2 查看日志目录下的namenode日志,如果出现:
Upgrade of ${dfs.namenode.name.dir} is complete
说明元数据已经升级成功
3.3 启动DataNodes:
在每一台datanode上面启动datanode服务
sbin/hadoop-daemon.sh start datanode
datanode节点会自动升级
3.4 等待namenode退出安全模式,然后执行fsck
bin/hdfs fsck /
3.5 确认目录健康,没有block丢失后可以执行finalzeUpgrade及启动secondarynamenode
bin/hdfs dfsadmin -finalizeUpgrade
#finalized后将不能rollback
sbin/hadoop-daemon.sh start secondarynamenode
#请清理掉dfs.namenode.checkpoint.dir目录下老版本文件,否则会启动失败
回滚操作:
若在升级过程中出了问题,想回滚到cdh3版本,一定不能执行bin/hdfs dfsadmin -finalizeUpgrade。在执行finalizeUpgrade之前都可以回滚
在cdh3 版本下面执行
(1)回滚Namenode,在namenode机器上面执行
bin/hadoop-daemon.sh start namenode -rollback
(2)回滚DataNode,在namenode机器上面执行
bin/hadoop-daemons.sh start datanode -rollback
也可以手工操作,把数据move回来,然后正常启动
(1)回滚Namenode的数据
remove dfs.name.dir/current目录,mv dfs.name.dir/previous dfs.name.dir/current目录
这样子就恢复回namenode的元数据了
(2)回滚DataNode的数据
remove dfs.data.dir/current目录,mv dfs.data.dir/previous dfs.data.dir/current目录
这样子就恢复回datanode的数据了
操作完后就可以重新启动cdh3版本了
总的来说,升级是:mv current previous,创建current,读旧的元数据,写成新版本到current里面,而DataNode节点上面的block数据通过hardlink来放到current目录下面
回滚是:rm current,mv previous current
参考:
http://cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH4-Installation-Guide/cdh4ig_topic_6_3.html