标签:des http io ar 使用 sp for java strong
本文在《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为active namenode;namenode2为standby namenode。
包含3个journalnode:
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
在下一篇文章中,我们会在本文的基础上继续介绍HA的主备自动切换的配置。通过配置zookeeper,实现HA的主备自动切换。
参考资料
http://hadoop.apache.org/docs/r2.2.0/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithQJM.html
标签:des http io ar 使用 sp for java strong
原文地址:http://www.cnblogs.com/denggeng/p/4162609.html