Hadoop2.0 QJM方式的HA的配置

本文在《Hadoop2.0的安装和基本配置》(见 http://www.linuxidc.com/Linux/2014-05/101173.htm )一文的基础上继续介绍hadoop2.0 QJM(Quorum Journal Manager)方式的HA的配置(hadoop2.0架构,具体版本是hadoop2.2.0)。本文只介绍HA的主备的手工切换,自动切换在下一篇文章继续介绍(见 http://www.linuxidc.com/Linux/2014-05/101176.htm)。

--------------------------------------分割线 --------------------------------------

相关阅读

Ubuntu 13.04上搭建Hadoop环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu上搭建Hadoop环境(单机模式+伪分布模式) http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu下Hadoop环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建Hadoop环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

搭建Hadoop环境(在Winodws环境下用虚拟机虚拟两个Ubuntu系统进行搭建) http://www.linuxidc.com/Linux/2011-12/48894.htm

--------------------------------------分割线 --------------------------------------

1 准备

文中描述的机器角色包含2个namenode:

  • namenode1
  • namenode2

其中namenode1为active namenode;namenode2为standby namenode。

包含3个journalnode:

  • journalnode1
  • journalnode2
  • journalnode3

journalnode的机器的数量是奇数,可以是3,5,7...,2n+1。

其他机器角色本文中不涉及的可以参考《hadoop2.0的安装和基本配置》一文。

2 配置

HA的配置只涉及到core-site.xml和hdfs-site.xml两个配置文件,其他配置可以文件参考《Hadoop2.0的安装和基本配置》一文。

2.1 core-site.xml

<configuration>

<property>

<name>fs.defaultFS</name>

<value>hdfs://mycluster</value>

</property>

<property>

<name>hadoop.tmp.dir</name>

<value>/home/tmp/hadoop2.0</value>

</property>

</configuration>

2.2 hdfs-site.xml

<configuration>

<property>

<name>dfs.replication</name>

<value>1</value>

</property>

<property>

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

<value>/home/dfs/name</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>/home/dfs/data</value>

</property>

<property>

<name>dfs.permissions</name>

<value>false</value>

</property>

<property>

<name>dfs.nameservices</name>

<value>mycluster</value>

</property>

<property>

<name>dfs.ha.namenodes.mycluster</name>

<value>nn1,nn2</value>

</property>

<property>

<name>dfs.namenode.rpc-address.mycluster.nn1</name>

<value>namenode1:8020</value>

</property>

<property>

<name>dfs.namenode.rpc-address.mycluster.nn2</name>

<value>namenode2:8020</value>

</property>

<property>

<name>dfs.namenode.http-address.mycluster.nn1</name>

<value>namenode1:50070</value>

</property>

<property>

<name>dfs.namenode.http-address.mycluster.nn2</name>

<value>namenode2:50070</value>

</property>

<property>

<name>dfs.namenode.shared.edits.dir</name>

<value>qjournal://journalnode1:8485;journalnode2:8485;journalnode3:8485/mycluster</value>

</property>

<property>

<name>dfs.journalnode.edits.dir</name>

<value>/home/dfs/journal</value>

</property>

<property>

<name>dfs.client.failover.proxy.provider.mycluster</name>

<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

<property>

<name>dfs.ha.fencing.methods</name>

<value>sshfence</value>

</property>

<property>

<name>dfs.ha.fencing.ssh.private-key-files</name>

<value>/root/.ssh/id_rsa</value>

</property>

<property>

<name>dfs.ha.fencing.ssh.connect-timeout</name>

<value>6000</value>

</property>

<property>

<name>dfs.ha.automatic-failover.enabled</name>

<value>false</value>

</property>

</configuration>

上述有些参数这里需要解释一下。

dfs.ha.automatic-failover.enabled

这里是把主备自动切换关闭,需要手工来切换。在下一篇文章会介绍通过配置zookeeper来实现主备自动切换。

fs.ha.namenodes.mycluster

<value>中的nn1,nn2分别是active namenode和standby namenode的namenode id,你也可以自己起一个namenode id,只要在参数中都保持一致就可以了。

dfs.namenode.shared.edits.dir

配置一组journalnode(3,5,7,...,2n+1)的URI,用于active namenode和standby namenode读写edits文件(原理可以参考前面的文章《hadoop2.0的HA介绍》),<value>中的mycluster是dfs.nameservices保持一致。你可以自己起一个nameservice ID,只要在参数中都保持一致就可以了。

dfs.journalnode.edits.dir

是在journalnode节点上用于存放active namenode和standby namenode共享的edits文件的目录。

dfs.ha.log-roll.period

active namenode的edits文件轮转的时间间隔,前面没有设置这个参数,默认值是120秒。即standby namenode会隔120秒要求active namenode切出一个edits文件,然后通过journalnode去同步这个文件。

active namenode会隔120秒会切出一个新edits文件,并且给这些edits文件一个编号,越新的edits文件编号越大。

日志轮转的时候开始会先生成一个新的“inprogress” edits文件(文件名带着“inprogress”),说明日志正在生成,轮转没完成。当过了120秒之后,日志轮转完成,文件改名,文件名字带着一个目前最大的编号(文件名没有“inprogress”)。然后生成一个新的“inprogress” edits文件,开始下一次edits文件轮转。

当发生主备切换的时候,会触发一次edit文件的轮转,这样standby namenode就会把剩下的edits文件同步过来,在切换到active状态时元数据能保持一个最新的状态。

dfs.ha.tail-edits.period

standby namenode每隔多长时间去检测新的edits文件。它只会检查已经完成轮转的edits文件,不会检查“inprogress” edits文件。

dfs.ha.fencing.methods

系统在任何时候只有一个namenode节点处???active状态。在主备切换的时候,standby namenode会变成active状态,原来的active namenode就不能再处于active状态了,否则两个namenode同时处于active状态会造成所谓的“脑裂”问题。所以在failover的时候要设置防止2个namenode都处于active状态的方法,可以是java类或者脚本。

fencing的方法目前有两种,sshfence和shell

sshfence方法是指通过ssh登陆到active namenode节点杀掉namenode进程,所以你需要设置ssh无密码登陆,还要保证有杀掉namenode进程的权限。

shell方法是指运行一个shell脚本/命令来防止“脑裂”问题,脚本需要自己写。

注意,QJM方式本身就有fencing功能,能保证只有一个namenode能往journalnode上写edits文件,所以是不需要设置fencing的方法就能防止“脑裂”问题的。但是,在发生failover的时候,原来的active namenode可能还在接受客户端的读请求,这样客户端很可能读到一些过时的数据(因为新的active namenode的数据已经实时更新了)。因此,还是建议设置fencing方法。如果确实不想设置fencing方法,可以设置一个能返回成功(没有fencing作用)的方法,如“shell(/bin/true)”。这个纯粹为了fencing方法能够成功返回,并不需要真的有fencing作用。这样可以提高系统的可用性,即使在fencing机制失败的时候还能保持系统的可用性。

3 启动

3.1 先在journalnode机器上启动journalnode

$Hadoop_HOME/sbin/hadoop-daemon.sh start journalnode

3.2 在namenode机器上启动namenode

其中namenode1为active namenode,namenode2为standby namenode

3.2.1

如果是首次启动,在namenode1上运行format命令

$HADOOP_HOME/bin/hadoop namenode -format

如果是非首次启动,则在namenode1上运行以下命令

$HADOOP_HOME/bin/hdfs namenode  -initializeSharedEdits

这里需要解释一下。

首次启动是指安装的时候就配置了HA,hdfs还没有数据。这时需要用format命令把namenode1格式化。

非首次启动是指原来有一个没有配置HA的HDFS已经在运行了,HDFS上已经有数据了,现在需要配置HA而加入一台namenode。这时候namenode1通过initializeSharedEdits命令来初始化journalnode,把edits文件共享到journalnode上。

3.2.2

然后在namenode1上启动namenode

$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode

3.2.3

在namenode2上运行以下命令

$HADOOP_HOME/sbin/hadoop-daemon.sh start  namenode -bootstrapStandby

这里也需要解释一下。

namenode2是不需要format的。

namenode2需要运行bootstrapStandby命令来同步namenode1的元数据,和namenode1的元数据保持一致。

具体过程是:前面说过namenode1通过initializeSharedEdits命令已经把edits文件共享到journalnode上了,现在namenode2需要通过bootstrapStandby命令把namenode1的元数据和journalnode的edits文件同步过来,从而使元数据和namenode1保持一致。

注意,这里需要journalnode上有足够的edits文件,这样才能保证namenode1和namenode2上的元数据保持一致。如果bootstrapStandby命令运行失败,可以手工把namenode1的元数据(即${dfs.namenode.name.dir}这个目录下的所有数据)拷贝到namenode2的${dfs.namenode.name.dir}这个目录下,再运行bootstrapStandby命令。

3.2.4

然后在namenode2上启动namenode

$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode

这时,namenode1和namenode2都启动了,都是“standby”状态。

3.2.5

在namenode1上运行

$HADOOP_HOME/bin/hdfs haadmin -transitionToActive nn1

这样,namenode1的状态就变成“active”。

3.3 在datanode机器上启动datanode

$HADOOP_HOME/sbin/hadoop-daemon.sh start datanode

这时HDFS就可以正常使用了,并且HA功能已经启动。

3.4 检查

可以通过以下页面查看active namenode(namenode1)和 standby namenode(namenode2)的状态

http://namenode1:50070/dfshealth.jsp

http://namenode2:50070/dfshealth.jsp

运行常用的HDFS shell命令测试HDFS是否正常。

4 测试

停掉namenode1的namenode(模拟namenode1挂掉),这时会发现hdfs不能用了。

在namenode2上运行以下命令

$HADOOP_HOME/bin/hdfs haadmin -transitionToActive nn2

namenode2的状态就变成“active”,这时 HDFS 恢复正常。

在namenode1上运行一下命令做主从切换

$HADOOP_HOME/bin/hdfs haadmin -failover nn1 nn2

这时namenode2的状态变成“active”,namenode1的状态变成“standby”。

5 QJM方式HA的结构图

QJM方式HA的结构涉及到active namenode,standby namenode,journalnode,datanode,client,这里通过一个图描述他们之间的关系。

6 实战tips

  • 在namenode1做的一些配置和操作,在namenode2上也要做一次,保持2台机器一致。
  • 注意首次启动(第一次启动的时候就是HA)和非首次启动(运行一段时间后加入HA特性)的区别。
  • 因为HA的自动切换容易出现ssh登陆和权限的问题,而且网上也有资料测试自动切换有时候会不成功,所以在生产环境还是建议采用手工切换的方式,这样更加可靠,有问题也可以及时查。

在下一篇文章中,我们会在本文的基础上继续介绍HA的主备自动切换的配置。通过配置zookeeper,实现HA的主备自动切换。

参考资料

http://hadoop.apache.org/docs/r2.2.0/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithQJM.html

时间: 2024-08-28 21:54:32

Hadoop2.0 QJM方式的HA的配置的相关文章

Hadoop2.0安装之非HA版

主要步骤跟Hadoop1.0(1.0安装地址)一致,主要在配置这块有更改 安装 下载地址:http://archive.apache.org/dist/hadoop/core/hadoop-2.6.5/ hadoop安装目录创建./tmp目录,./dfs/name,./dfs/data 修改./etc/hadoop/hadoop-env.sh # 设置JAVA_HOME export JAVA_HOME="/usr/local/src/jdk1.8.0_181/" 修改./etc/ha

【甘道夫】Hadoop2.2.0 NN HA详细配置+Client透明性试验【完整版】

引言: 前面转载过一篇团队兄弟[伊利丹]写的NN HA实验记录,我也基于他的环境实验了NN HA对于Client的透明性. 本篇文章记录的是亲自配置NN HA的详细全过程,以及全面测试HA对客户端访问透明性的全过程,希望对大家有帮助. 实验环境: Hadoop2.2.0的4节点集群,ZK节点3个(ZK节点数最好为奇数个),hosts文件和各节点角色分配如下: hosts: 192.168.66.91 master 192.168.66.92 slave1 192.168.66.93 slave2

Cloudera Hadoop 5&amp; Hadoop高阶管理及调优课程(CDH5,Hadoop2.0,HA,安全,管理,调优)

1.课程环境 本课程涉及的技术产品及相关版本: 技术 版本 Linux CentOS 6.5 Java 1.7 Hadoop2.0 2.6.0 Hadoop1.0 1.2.1 Zookeeper 3.4.6 CDH Hadoop 5.3.0 Vmware 10 Hive 0.13.1 HBase 0.98.6 Impala 2.1.0 Oozie 4.0.0 Hue 3.7.0 2.内容简介 本教程针对有一定Hadoop基础的学员,深入讲解如下方面的内容: 1.Hadoop2.0高阶运维,包括H

【伊利丹】Hadoop2.0 NN HA实验记录

1.关于Hadoop2.2.0中HA的介绍 NameNode 简称: NN DateNode 简称: DN JournalNode  简称: JN Zookeeper  简称: ZK 从上面的图里,我们可以知道HA的大致架构: 01.利用共享存储来在两个NN之间同步元数据信息. 在NN中有两个重要的文件:一个是fsimage,一个是edits,其中fsimage指的是元数据镜像文件,存在磁盘中用来保持文件系统的目录树,然而edits指的是元数据操作日志,针对目录树的修改操作,被写入共享存储系统中

hadoop2.0安装和配置

hadoop2与hadoop1的配置有些许不同,最主要的是hadoop1里的master变成了yarn 这篇文直接从hadoop的配置开始,因为系统环境和jdk和hadoop1都是一样的. hadoop1的配置链接,从第六步开始 六.设置hadoop2参数 进入 usr/local/hadoop/etc/hadoop 文件夹,即可看到以下文件 6.1配置hadoop-env.sh 找到export JAVA_HOME这一行,去除前面的#号注释符. 修改 export JAVA_HOME=/usr

hadoop2.0 配置yarn成功

很久不写 BO-KE 了,来一篇吧,记住这个成功的一刻,把几个主要文件贴出来: core-site.xml: <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <config

Hadoop2.0构成之HDFS2.0

HDFS2.0之HA 主备NameNode: 1.主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换: 2.主NameNode的信息发生变化后,会将信息写到共享数据存储系统中让备NameNode合并到自己的内存中: 3.所有DataNode同时向两个NameNode发送心跳信息(块信息): 两种切换方式: 1.手动切换:通过命令实现主备之间的切换,可以用于HDFS升级等场合: 2.自动切换:基于Zookeeper实现: Zookeeper Failover

RedHadoop创始人童小军在北京开讲“Hadoop2.0集群优化与管理”啦!

一.活动介绍 目前Hadoop的应用越来越广泛,开始被很多企业采用,且Hadoop人才十分稀缺和抢手,待遇也远比Java..Net开发好.为了帮助您快速掌握Hadoop的前沿技术,了解企业应用Hadoop的性能优化,CSDN特别邀请您参加我们精心策划的Hadoop2.0运维管理与集群安装监控管理实训班.届时,在历时一天的实训班上,RedHadoop创始人童小军将为您分享Hadoop企业应用成功案例.讲解Hadoop技术架构知识与小窍门. 期待您的加入,名额有限,感兴趣的小伙伴们欲报从速哦!另外,

Hadoop2.0安装之YARN

YARN(Yet Another Resource Negotiator)是Hadoop2.0集群中负责资源管理和调度以及监控运行在它上面的各种应用,是hadoop2.0中的核心,它类似于一个分布式操作系统,通过它的api编写的应用可以跑在它上面,支持临时和常驻的应用,集群的资源可以得到最大限度的共享.资源是指CPU,内存,硬盘,带宽等可以量化的东西. Hadoop1.0和2.0架构对比 1.0的绝对核心是mapreduce,只能跑mapreduce的任务:2.0的绝对核心是YARN,除了可以跑