首家大数据培训挂牌机构 股票代码:837906 | EN CN

Hadoop升级方案(二):从Hadoop 1.0升级到2.0(1)

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

分享到:



2013年10月15日,Hadoop 2.0的第一个稳定版2.2.0发布,对于大部分公司而言,这是一个惊喜,因为Hadoop 2.0解决了Hadoop 1.0中存在的诸多问题,比如NameNode单点故障、NameNode内存制约HDFS扩展性、MapReduce支持的计算框架过于单一等问题,但同时也面临一个较为困难的问题:如果将公司正使用的线上Hadoop版本(可能是apache hadoop 1.x.x版本,也可能是cdh3等)升级到最新的2.x.x版本?本文则尝试回答这一问题。

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)升级到2.x.x。第一种情况的介绍可参考我的另一篇文章:“Hadoop升级方案(一):Hadoop 内部版本升级”

1. 基础知识准备

由于Hadoop 2.0增加了很多新的特性,包括HDFS HA,HDFS Federation,新的资源管理系统YARN等,在部署Hadoop 2.0之前,你需要对这些特性有一个理论上的了解,推荐阅读以下资料:

(1)HDFS Federation设计动机与基本原理

(2)Hadoop 2.0中单点故障解决方案总结

(3)Hadoop YARN资料汇总

(4) Hadoop 2.2.0设计文档

2. Hadoop升级概述

在当前这个过渡时期,大部分公司目前采用的版本一般为apache 版本,比如apache hadoop 0.20.2、0.203.0、1.x.x等,或者cloudera的cdh3,比如cdh3u2,cdh3u3,cdh3u4等,那么,如何将这些版本升级到最新的hadoop版本呢,比如升级到apache hadoop 2.2.0或者cdh4。

在 “Hadoop升级方案(一):Hadoop 1.0内部版本升级”一文中我已经提到,Hadoop升级中最重要最关键的是HDFS的升级,而其他系统的升级,比如YARN、MapReduce等则容易得多。

Hadoop 1.0到2.0的基本过程如下:

步骤1:HDFS升级(最关键最核心的);

步骤2:MapReduce升级(MRv1->MRv2,新增一个资源管理系统YARN);

步骤3:HBase以及更上层系统的升级,这通常取决于具体情况,由于Hadoop 2.0启用了Protocol Buffers,无法兼容之前的RPC协议,因此,需根据具体说明文档选取兼容版本,比如HBase 0.96可以兼容最新版本2.2.0,版本兼容矩阵和升级流程可参考“Hadoop version support matrix” “HBase updating”

3. HDFS升级过程介绍

Hadoop 2.x.x中的HDFS完全兼容Hadoop 1.x.x(配置文件无需进行任何修改,直接重用旧的即可),如果想完全按照兼容模式升级,则可以直接参考我的文章“Hadoop升级方案(一):Hadoop 1.0内部版本升级”。不过这种模式下无法使用HDFS的新特性,比如HA和Federation,则按照本节介绍的步骤操作。

HDFS的升级步骤可概括为:

步骤1:停掉HDFS,备份关键数据,包括元数据文件、配置文件;

步骤2:下载新版本Hadoop安装jar包,比如apache hadoop 2.2.0;

步骤3:   部署新版本jar包,替换配置文件,并修改配置文件(新版本增加了一些新的配置项);

步骤4:   执行HDFS提供的版本升级命令进行升级,查看升级进度,一旦发现问题,则进行回滚。

注意,HDFS的升级速度与HDFS中block数目相关,现在集群升级时,应为升级留出预估的时间窗口。

HDFS升级的详细步骤如下:

步骤1:停掉HDFS:bin/stop-dfs.sh

备份关键数据,包括:

(1) 元数据文件:具体位置由配置文件hdfs-site.xml中的属性“dfs.name.dir”指定,如果指定了多个目录,则每个目录下有一个元数据文件副本,应确认哪一个副本是当前正在使用且完成的元数据目录,并对该目录进行备份。

(2)配置文件:包括conf目录下的所有文件。

步骤2:下载最新稳定版的hadoop 2.x.x版本,可从http://www.apache.org/dyn/closer.cgi/hadoop/common/上选择一个镜像下载。每个可下载版本包括两个压缩包,一个是hadoop-{HADOOP_VERSION}-src.tar.gz,即Hadoop源代码;另一个是hadoop-{HADOOP_VERSION}.tar.gz,这个是hadoop 安装包。另外,apache的这个官网只给出了最新的稳定版,如果想查看所有Hadoop版本,可直接进入hadoop svn:http://svn.apache.org/repos/asf/hadoop/common/branches/

注意,从这里下载的安装包中同时包含了HDFS和MRv2/YARN。

步骤3:部署新版Hadoop。

首先,部署jar包。可将新版Hadoop直接部署到旧版Hadoop同级目录下,具体的Hadoop部署目录我已经在“Hadoop升级方案(一):Hadoop 1.0内部版本升级”一文中进行了介绍,大家可参考以下。

接下来分几种情况讨论,分别是:仅使用HA,同时使用HA和federation和使用Client-side mount table三种情况,由于篇幅的限制,本文先介绍第一种情况,其他两种情况将在另外一篇文章中介绍。

“仅使用HA”是指整个集群只有一个对外可用的namenode,同时为这个namenode增加一个backup namenode以解决HDFS单点故障问题。注意,此时,backup namenode除了充当主namenode的热备外,还兼有secondary namenode的功能,因此,无需再重复部署secondary namenode。这种部署方式应是大部分中小型公司采用的架构。具体如下图所示:

在上图中,存在两个namenode,但只有一个对外提供服务,另外一个作为备用。为此,需修改客户端、namenode和datanode上的hdfs-site.xml。需要注意的是,hadoop 2.0中namenode支持federation,即可以有多个namenode同时对外提供服务,每个namenode分管一部分目录,为此引入了namenode命名空间的概念,即你可以将不同的namenode划分到不同命名空间中。

这里讨论的仍只有一个对外可用namenode的情况,所以只有一个命名空间,我们将之命名为“ns1”,它包含主备两个namenode:nn1和nn3,为此,我们可以进行如下配置:

<property>
    <name>dfs.nameservices</name>
    <value>ns1</value>
    <description>提供服务的NS逻辑名称,与core-site.xml里的对应</description>
</property>
<property>
    <name>dfs.ha.namenodes.ns1</name>
    <value>nn1,nn3</value>
</property>

<property>
    <name>dfs.namenode.rpc-address.ns1.nn1</name>
    <value>host-nn1:9000</value>
</property>

<property>
    <name>dfs.namenode.http-address.ns1.nn1</name>
    <value>host-nn1:50070</value>
</property>

<property>
    <name>dfs.namenode.rpc-address.ns1.nn3</name>
    <value>host-nn3:9000</value>
</property>

<property>
    <name>dfs.namenode.http-address.ns1.nn3</name>
    <value>host-nn3:50070</value>
</property>

我们可以很容易从属性名中了解以上配置属性的含义,比如“dfs.namenode.rpc-address”是对外RPC Server的地址,“dfs.namenode.http-address”是HTTP 访问地址。

除了以上配置外,还需设置主备namenode的共享信息存放位置,可使用配置项“dfs.namenode.shared.edits.dir”指定。目前有两种成熟的共享存储系统可供选择,一个是NFS,另外一个是QJM。

如果采用NFS,则配置方式如下:

<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>file:///mnt/filer1/dfs/ha-name-dir-shared</value>
  <description>指定用于HA存放edits的共享存储,通常是NFS挂载点</description>
</property>

如果采用QJM,则配置方式如下:

<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value>
</property>

其中,node1.example.com:8485,node2.example.com:8485和node3.example.com:8485是三个JournalNode的启动位置,注意,JournalNode数目最好为奇数个,一般3个足够。

如何启动JournalNode:

在JournalNode的各个节点上部署一份Hadoop代码,在hdfs-site.xml中添加以下配置,设置数据存放目录(注意,只能配置一个目录):

<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/path/to/journal/node/local/data</value>
</property>

然后执行“hdfs-daemon.sh journalnode”,启动JournalNode服务。

另外,为了访问HDFS方便,你需要在各个节点上的core-site.xml中设置默认目录前缀:

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://ns1</value>
</property>

到此为止,我们配置的HA的namenode是不能够自动切换的,需要由管理员使用“bin/hadoop dfsadmin”命令人工切换,通常用户namenode在线升级等。为了支持namenode出现故障时自动切换,你需要配置zookeeper,具体如下:

<property>
    <name>ha.zookeeper.quorum</name>
    <value>zk1:2181,zk2:2181,zk3:2181,</value>
    <description>指定用于HA的ZooKeeper集群机器列表</description>
</property>
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>

其中,zk1、zk2和zk3是你已经配置好的zookeeper实例,对于zookeeper的部署和搭建,不再本文讨论范畴。

上面只是基础的配置,除了这些以外,你还需要配置datanode数据存放位置,副本数等信息,这些参数与Hadoop 1.0一样(hadoop2.0对部分参数进行了重命名,但是仍然兼容1.0中的参数),你可以按照hadoop 1.0的配置方法设置。

经过上面的配置,你可以进入升级阶段。

步骤4:执行HDFS升级命令。

整个升级过程跟我在文章“Hadoop升级方案(一):Hadoop 1.0内部版本升级”介绍的升级过程基本一致。

在主namenode上执行以下命令进行升级:

(1)启动namenode:

bin/hdfs 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/hadoop dfsadmin –finalizeUpgrade 最终提交升级

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

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

步骤1:停掉当前Hadoop:bin/stop-all.sh

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

步骤3:回滚:bin/start-dfs.sh –rollback

4. MapReduce升级过程

在Hadoop 2.0中,MapReduce应用程序直接运行在新的资源管理系统YARN上,这意味着,我们只需部署YARN,而MapReduce应用程序相关逻辑以便变成了一个客户端的编程库,无需单独部署或者显式地升级MapReduce。

在上面介绍的HDFS升级过程中,我们已经将YARN的代码部署(与HDFS放在一起)完毕,只需修改mapred-site.xml和yarn-site.xml两个配置文件,然后启动ResourceManager,NodeManager等服务即可,具体可参考我的这篇文章:http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-install/

由于MRv2完全兼容MRv1的应用程序,这样,启动YARN之后,你可以直接向YARN提交之前编写的MapReduce程序,无需进行任何修改。

5. 问题讨论

(1)我们配置了主备两个namenode,如何确定指定哪个是主,哪个是备呢?

答:不支持显式的指定,HDFS会将第一个启动的namenode作为主namenode。

(2)是否可以配置多于2个的备用namenode?

答:目前仅支持主备两个namenode,也就是说,只有一个备用namenode,不支持更多的备用namenode

(3)主备namenode之间的共享存储能够有多个?

答:目前仅支持一个。

【另一篇网友写hadoop升级文章是“从Hadoop1.x集群升级到Hadoop2.x步骤”,推荐阅读。】