Hadoop升级方案(一):Hadoop 1.0内部版本升级(初稿)

于2017-03-29由小牛君创建

分享到:



一般而言,Hadoop版本升级通常分为以下几种情况:

(1)Hadoop 1.x.x版本(或者更低版本,比如0.20.2)内部升级。分为两类,第一类是,同一个发行版内部版本间升级,比如从apache hadoop 0.20.2升级到apache hadoop 1.0.2,从cdh3u2升级到cdh3u6;第二类是,不同发行版之间的版本升级,比如从apache hadoop 0.20.2升级到cdh3u3。

(2)Hadoop 1.x.x(或者更低版本,比如0.20.2)升级到2.x.x。分为两类,第一类是,同一个发行版内部版本间升级, 比如从apache hadoop 1.1.2升级到apache hadoop 2.2.0,或者从cdh3u2升级到cdh4.4.0;第二类是,不同发行版之间的版本升级,从cdh3u3升级到apache hadoop 2.2.0。

(3)Hadoop 2.x.x内部版本升级,与(1)类似。

本文将介绍第一种情况,即如何进行Hadoop 1.x.x版本(或者更低版本,比如0.20.2)内部升级。如果你已经确定要从hadoop 1.0升级到2.0,可参考我的文章“Hadoop升级方案(二):从Hadoop 1.0升级到2.0(1)”和“Hadoop升级方案(二):从Hadoop 1.0升级到2.0(2)”进行升级。为了便于说明,本文以apache hadoop 0.20.2升级到cdh-0.20.2-3u2为例进行介绍,其他版本间升级类似。

在正式介绍之前,你需要先了解以下基础知识:

(1)apache发行版和cloudera发行版的各版本含义、特点及包含的特性,具体可阅读我的这篇文章:“Hadoop版本选择探讨”

(2)apache 1.x.x(或者更低版本,比如0.20.2)中各版本的特点以及包含的特性,可阅读我写的Hadoop书《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》中的第二章了解详情。

Hadoop 1.0内部版本升级时的最重要的系统是HDFS,HDFS关系到整个Hadoop集群中数据的完整性,一旦升级过程中出现HDFS数据丢失或者损坏,其他系统的升级,比如MapReduce、HBase等,变得没有了意义。从一定程度上说,Hadoop内部版本的升级实际上就是HDFS的升级,其他软件只需替换jar包重启即可(大部分是这样的,个别特例除外),没有太多复杂的操作。

就目前而言,大部分公司仍然采用的Hadoop 1.0版本,比如hadoop 0.20.2、hadoop 1.1.2或者cdh3u6等,但考虑到hadoop 2.0的第一个稳定版2.2.0已经率先由apache发布,因此可能大部分公司会考虑直接将1.0版本升级到2.0版本,而不是在1.0内部升级。但是,个人觉得是否升级到2.0,需考虑以下问题:你是不是真的需要2.0里面的功能?2.0更加强大,但带来更大的维护成本,你们是否具备这样的能力驾驭2.0?2.0中比较好的重大特性如下:

(1)NameNode单点故障问题得到解决,具体可阅读我的这篇文章“Hadoop 2.0中单点故障解决方案总结”;

(2)NameNode内存受限问题得到解决,具体可阅读我的这篇文章“HDFS小文件及解决方案”;

(3)可支持多类框架运行在一个集群中,比如MapReduceTezStorm、Spark等,具体可阅读我的这篇文章“运行在YARN上的计算框架”

1. 准备工作

正式开始进行升级(apache hadoop 0.20.2升级到cdh-0.20.2-3u2)操作之前,需进行一些准备工作,具体如下:

(1)准备hadoop-0.20.2-cdh3u2 jar包(下载地址可查看我的这篇文章“Hadoop版本选择探讨”

(2)备份好namenode元数据文件(在集群关闭的状态下进行),即edits和fsimage,比如:

在namenode所在节点上,查看你的元数据文件存放位置:

$ grep -C1 dfs.name.dir /etc/hadoop/conf/hdfs-site.xml

<property>

<name>dfs.name.dir</name>

<value>/mnt/hadoop/hdfs/name</value>

</property>

然后备份该目录下的文件:

$ cd /mnt/hadoop/hdfs/name

# tar -cvf /root/nn_backup_data.tar .

(3)备份所有配置文件(比如core-site.xml、mapred-site.xml、hdfs-site.xml等)

2. hadoop升级

步骤1:停掉Apache Hadoop 0.20.2的基础服务:bin/stop-all.sh;停掉Hadoop上层的服务,比如HBase、Hive等;

步骤2:部署Hadoop- 0.20.2-CDH3u2,注意,前一版本的所有文件均不能重用,要完全替换:,配置文件可直接重用前一版本的。一般的做法是,将该版本单独放到一个目录下,并将前一版本的配置文件替换到新版本对应目录下;

步骤3:启动新版本hadoop:

(1)启动namenode:

bin/hadoop-daemon.sh start namenode -upgrade

(2)启动HDFS:

bin/start-dfs.sh

【注】上述两个步骤也可以合并成:

bin/start-dfs.sh –upgrade

可使用命令:

bin/hadoop dfsadmin -upgradeProgress status

查看升级进度

也可以通过查看namenode和datanode日志判断升级是否完毕。

【注】升级完毕后,namenode和datanode的${ dfs.data.dir}/目录下会多出一个文件夹previous/,这是升级之前数据的备份。

如果确定升级成功,可以使用以下命令最终提交升级:

bin/hadoopdfsadmin–finalizeUpgrade

注意,输入该命令后,备份数据previous/会自动被删除,之后不能再进行回滚。

如果升级过程中出现错误,则需要回滚,回滚步骤如下:

步骤1:停掉当前Hadoop(Hadoop- 0.20.2-CDH3u2):

bin/stop-all.sh

步骤2:重新部署之前版本Apache Hadoop 0.20.2

步骤3:回滚:

bin/start-dfs.sh -rollback

(3)启动MapReduce以及上层服务:

bin/start-mapred.sh

注意,通常而言,HBase能够兼容下面的HDFS,无需一起升级,特殊版本除外。

3. 建议Hadoop目录部署方式

对外提供统一目录hadoop,建议采用软连接来回切换不同版本的Hadoop,升级之前,hadoop指向旧版本Hadoop:

ln –s hadoop_versions/hadoop-0.20.2-cdh hadoop

升级时,让hadoop指向新版本Hadoop:

ln –s hadoop_versions/hadoop-0.20.2 hadoop

配置文件路径可也采用类似方法。

这样,HADOOP_HOME值对外的透明的,升级前后不变。

4. 升级速度优化

HDFS升级的快慢取决于集群中block的多少,而HDFS的升级时间主要花在为block文件建立硬链接上,具体优化方法可参考我的这篇文章:“Hadoop 升级创建硬链接效率优化”。

5. 总结

Hadoop升级成败的关键是数据存储系统HDFS的升级成功,其他系统只需简单替换jar包重启就行。为了确保升级万无一失,一定要现在测试集群上进行升级预演,然后再对线上集群升级。为了防止线上Hadoop升级时出现重大故障,一定要对重要的元数据信息进行备份,并制定规范的回滚策略。