二十三、Hadoop的HA(高可用)

       今天来给Hadoop的部分收收尾,这是Hadoop系列的最后一篇文章了,因为HA需要用到Zookeeper,所以在讲解了Zookeeper的部分内容后,才重新回过头来看Hadoop的HA部分,关注专栏《破茧成蝶——大数据篇》,查看更多相关的内容~


目录

一、HA概述

二、HDFS HA

2.1 HDFS HA工作机制

2.1.1 工作要点

2.1.2 工作机制

2.2 HDFS HA配置

2.2.1 环境准备

2.2.2 集群节点规划

2.2.3 配置Zookeeper集群

2.2.4 配置HDFS HA

2.2.5 启动HDFS HA集群

2.2.6 配置自动故障转移

三、Yarn HA

3.1 规划集群

3.2 配置Yarn HA


一、HA概述

       HA(High Available),即高可用(7*24小时不中断服务)。实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。NameNode主要在以下两个方面影响HDFS集群:(1)NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启。(2)NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用。
       HDFS HA功能通过配置Active/Standby两个NameNode实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。

二、HDFS HA

2.1 HDFS HA工作机制

2.1.1 工作要点

       1、元数据管理方式需要改变。
       (1)内存中各自保存一份元数据;
       (2)Edits日志只有Active状态的NameNode节点可以做写操作;
       (3)两个NameNode都可以读取Edits;
       (4)共享的Edits放在一个共享存储中管理(qjournal和NFS两个主流实现);
       2、需要一个状态管理功能模块。
       实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在NameNode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象的发生。
       3、必须保证两个NameNode之间能够ssh无密码登录。
       4、隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务。

2.1.2 工作机制

       1、自动故障转移为HDFS部署增加了两个新组件:ZooKeeper和ZKFailoverController(ZKFC)进程。ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。HA的自动故障转移依赖于ZooKeeper的以下功能:

       (1)故障检测:集群中的每个NameNode在ZooKeeper中维护了一个持久会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。
       (2)现役NameNode选择:ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。

       2、ZKFC是自动故障转移中的另一个新组件,是ZooKeeper的客户端,也监视和管理NameNode的状态。每个运行NameNode的主机也运行了一个ZKFC进程,ZKFC负责:

       (1)健康监测:ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。
       (2)ZooKeeper会话管理:当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。
       (3)基于ZooKeeper的选择:如果本地NameNode是健康的,且ZKFC发现没有其它的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地NameNode为Active。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役NameNode,然后本地NameNode转换为Active状态。

2.2 HDFS HA配置

2.2.1 环境准备

       包括:修改IP,更改主机名、主机映射,关闭防火墙,关闭安全子系统,配置免秘钥登录,安装JDK配置环境变量等等。这些在前文中都有说道,在这就不再赘述了,可以参考《二、Linux下搭建Hadoop的运行环境》

2.2.2 集群节点规划

master

 slave01

slave02

NameNode    

NameNode

 

JournalNode  

JournalNode  

JournalNode  

DataNode

DataNode

DataNode

ZK 

ZK 

ZK 

 

ResourceManager

 

NodeManager

NodeManager

NodeManager

2.2.3 配置Zookeeper集群

       步骤同《二、Linux安装Zookeeper》中分布式安装Zookeeper的步骤。

2.2.4 配置HDFS HA

1、首先在/opt/modules目录下新建ha目录,并将hadoop-2.7.2目录拷贝到ha目录下:

2、在hadoop-env.sh中配置JAVA_HOME:

3、配置core-site.xml文件

<configuration>
	<!-- 把两个NameNode的地址组装成一个集群namenodecluster -->
	<property>
		<name>fs.defaultFS</name>
    	<value>hdfs://namenodecluster</value>
	</property>

	<!-- 指定hadoop运行时产生文件的存储目录 -->
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/opt/modules/ha/hadoop-2.7.2/data/tmp</value>
	</property>
</configuration>

4、配置hdfs-site.xml文件

<configuration>
	<!-- 完全分布式集群名称 -->
	<property>
		<name>dfs.nameservices</name>
		<value>namenodecluster</value>
	</property>

	<!-- 集群中NameNode节点都有哪些 -->
	<property>
		<name>dfs.ha.namenodes.namenodecluster</name>
		<value>nn1,nn2</value>
	</property>

	<!-- nn1的RPC通信地址 -->
	<property>
		<name>dfs.namenode.rpc-address.namenodecluster.nn1</name>
		<value>master:9000</value>
	</property>

	<!-- nn2的RPC通信地址 -->
	<property>
		<name>dfs.namenode.rpc-address.namenodecluster.nn2</name>
		<value>slave01:9000</value>
	</property>

	<!-- nn1的http通信地址 -->
	<property>
		<name>dfs.namenode.http-address.namenodecluster.nn1</name>
		<value>master:50070</value>
	</property>

	<!-- nn2的http通信地址 -->
	<property>
		<name>dfs.namenode.http-address.namenodecluster.nn2</name>
		<value>slave01:50070</value>
	</property>

	<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
	<value>qjournal://master:8485;slave01:8485;slave02:8485/namenodecluster</value>
	</property>

	<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
	<property>
		<name>dfs.ha.fencing.methods</name>
		<value>sshfence</value>
	</property>

	<!-- 使用隔离机制时需要ssh无秘钥登录-->
	<property>
		<name>dfs.ha.fencing.ssh.private-key-files</name>
		<value>/root/.ssh/id_rsa</value>
	</property>

	<!-- 声明journalnode服务器存储目录-->
	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/opt/modules/ha/hadoop-2.7.2/data/jn</value>
	</property>

	<!-- 关闭权限检查-->
	<property>
		<name>dfs.permissions.enable</name>
		<value>false</value>
	</property>

	<!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
	<property>
  		<name>dfs.client.failover.proxy.provider.mycluster</name>
	<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
</configuration>

5、将设置好的文件分发到其他节点

xsync /opt/modules/ha

2.2.5 启动HDFS HA集群

1、首先启动journalnode服务:

sbin/hadoop-daemons.sh start journalnode

2、在nn1上格式化NameNode并启动:

bin/hdfs namenode -format

sbin/hadoop-daemon.sh start namenode

3、在nn2上同步nn1的元数据信息并启动,这里需要注意的是:NameNode只能格式化一次!

bin/hdfs namenode -bootstrapStandby

sbin/hadoop-daemon.sh start namenode

4、浏览器访问进行测试

5、在nn1上启动所有的DataNode

sbin/hadoop-daemons.sh start datanode

6、将nn1的NameNode更改为Active

bin/hdfs haadmin -transitionToActive nn1

再次刷新浏览器:

也可以使用命令查看nn1是否为Active:

bin/hdfs haadmin -getServiceState nn1

2.2.6 配置自动故障转移

1、修改hdfs-site.xml配置文件,在下方添加如下内容:

	<property>
		<name>dfs.ha.automatic-failover.enabled</name>
		<value>true</value>
	</property>

2、在core-site.xml文件中增加如下内容:

	<property>
		<name>ha.zookeeper.quorum</name>
		<value>master:2181,slave01:2181,slave02:2181</value>
	</property>

配置完之后别忘了将修改的文件分发到其余的机器。

3、 删除目录下的data和logs文件。

rm -rf ./data ./logs

4、启动服务

(1)首先启动Zookeeper集群和journalnode服务。

bin/zkServer.sh start

sbin/hadoop-daemons.sh start journalnode

(2)格式化NameNode,同样的,只在一台机器上格式化即可。

bin/hdfs namenode -format

(3)初始化HA在Zookeeper中状态,值得注意的是,只需要在其中一台机器上执行就可以了

bin/hdfs zkfc -formatZK

此处,相当于在Zookeeper中新建了一个Node,如下所示:

 

(4)启动HDFS服务

sbin/start-dfs.sh

(5)在nn2上执行如下命令同步nn1的元数据信息 

bin/hdfs namenode -bootstrapStandby

(6)单独启动nn2的NameNode

sbin/hadoop-daemon.sh start namenode

5、测试验证

目前,是master节点的NameNode处于Active的状态,现在我们手动杀死master节点的NameNode,发现slave01节点上的NameNode自动的由Standby转换为Active。

三、Yarn HA

3.1 规划集群

hadoop102

hadoop103 

hadoop104

NameNode    

NameNode

 

JournalNode  

JournalNode  

JournalNode  

DataNode

DataNode

DataNode

ZK

ZK

ZK

ResourceManager 

ResourceManager 

 

NodeManager

NodeManager

NodeManager

3.2 配置Yarn HA

1、在yarn-site.xml中添加如下配置

<configuration>

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <!--启用resourcemanager ha-->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
 
    <!--声明两台resourcemanager的地址-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster-yarn1</value>
    </property>

    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>master</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>slave01</value>
    </property>
 
    <!--指定zookeeper集群的地址--> 
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>master:2181,slave01:2181,slave02:2181</value>
    </property>

    <!--启用自动恢复--> 
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
 
    <!--指定resourcemanager的状态信息存储在zookeeper集群--> 
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>

</configuration>

2、将修改的内容同步到其余各个节点。

3、启动服务

(1)启动Zookeeper

bin/zkServer.sh start

(2)启动hdfs相关服务

sbin/start-dfs.sh

(3)启动yarn服务

sbin/start-yarn.sh

此时,需要去另外一条机器上启动ResourceManager。

sbin/yarn-daemon.sh start resourcemanager

4、查看状态

bin/yarn rmadmin -getServiceState rm1

通过页面访问,不管输入的是master还是slave01,都会跳转到active状态的节点上,这里是master:

本文到此也就结束了,你们在此过程中存在什么问题,欢迎留言,让我看看你们都遇到了什么问题~

猜你喜欢

转载自blog.csdn.net/gdkyxy2013/article/details/108489373