为了更好地紧跟大数据发展先进性的技术趋势,追赶业界最顶尖的发展技术,我们把线上环境的Hadoop 1.2.1升级到2.6.0版本。这次的升级其实早有预谋,但鉴于升级过程较为繁琐,并且不但涉及HDFS的底层存储的升级,还涉及Hive、Hbase等上层系统的使用,有一定的风险,因此一直都在等待一个合适的时机。直到最近,我们的利用了Hadoop2.6.0和HBase的0.98.8的API的ETL系统正式完成开发,要在线上环境进行部署的时候,我们才决心要升级。
虽然之前已经在测试环境进行了一次升级的尝试,并且已经踩过不少的坑,但在线上环境进行升级的过程,还是出现了各种问题,不过最终还是顺利完成了整个升级过程。我们的线上环境之前总共13个节点,其中有12个DataNode和TaskTracker,另外还有1个NameNode和JobTracker,在这次的升级之前,刚好有一台新机器可以一并部署,于是就决定全部14台机器一并升级。另外集群升级之前,所有DataNode节点总共约有60TB的HDFS空间,并且已经使用其中的26TB来存放HDFS数据。
整个升级步骤总体分为三步:
1、Hadoop升级。Hadoop 1.2.1 -> Hadoop 2.6.0
2、HBase升级。HBase 0.94.17 -> HBase 0.96.2 -> HBase 0.98.8
3、Hive依赖配置。
另外要说明的是,这次的升级没有进行HDFS的HA特性的配置升级,由于考虑到HA特性需要更改相关的Hive、HBase相关元数据,所以还是用回旧的secondary namenode特性。建议在参考本文升级步骤之前,请先在官网阅读相关文档,理解相关特性。
Hadoop升级
-
准备
(1)停止相关服务。包括HBase,HiveServer2。
首先停止上层系统,防止升级过程中对Hadoop的影响。
(2)进入安全模式。
Hadoop有一个安全模式,进入安全模式之后,会禁止HDFS系统的文件进行修改和删除,一般是在系统启动的时候,进入初始化的过程中会进入该状态。由于我们在之后的备份需要读取HDFS节点的状态,因此进入安全模式防止对文件系统的修改。相关命令:
[hadoop@namenode]$ hadoop dfsadmin -safemode enter
(3)备份相关数据。
运行这些命令来进行相关HDFS状态的备份。
//文件块数情况
[hadoop@namenode]$ hadoop fsck / -files -blocks -locations > dfs-old-fsck-1.log
//目录情况
[hadoop@namenode]$ hadoop dfs -lsr / > dfs-old-lsr-1.log
//HDFS结点情况
[hadoop@namenode]$ hadoop dfsadmin -report > dfs-old-report-1.log
//把NameNode在内存中的HDFS节点情况保存到硬盘里
[hadoop@namenode]$ hadoop dfsadmin -saveNamespace
//手动备份NameNode数据目录,{dfs.name.dir}是hdfs-site.xml设置的路径
[hadoop@namenode]$ cp {dfs.name.dir} .
fsck命令会在最后输出HDFS是否为健康状态(Status: HEALTHY),若有损坏block则要进行恢复。
(4)终结之前的升级状态。
防止在升级过程中,存有上次升级过程遗留的状态,需要清理掉。
[hadoop@namenode]$ hadoop namenode -finalize
(5)备份Hive元数据(可选)
我们集群使用了mysql来保留,因此对mysql进行数据库备份。