(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(初稿)”(尚未完成)进行升级。为了便于说明,本文以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)可支持多类框架运行在一个集群中,比如 MapReduce、 Tez、 Storm、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升级时出现重大故障,一定要对重要的元数据信息进行备份,并制定规范的回滚策略。
原创文章,转载请注明: 转载自 董的博客
本文链接地址: http://dongxicheng.org/mapreduce-nextgen/hadoop-upgrade-in-version-1/
作者: Dong,作者介绍: http://dongxicheng.org/about/
本博客的文章集合: http://dongxicheng.org/recommend/
Copyright © 2013