Hadoop环境搭建之HA模式

  • Post author:
  • Post category:其他




一、Hadoop HA 概述

1、HA(High Available),即高可用(不能中断服务)。

2、实现高可用最关键的策略是消除单点故障。HA 严格来说应该分成各个组件的 HA 机制:HDFS 的HA 和 YARN 的 HA。

3、Hadoop2.0 之前,在 HDFS 集群中 NameNode 存在单点故障(SPOF)。

4、NameNode 主要在以下两个方面影响HDFS集群

(1) NameNode 机器发生意外,如宕机,集群将无法使用,直到管理员重启。

(2) NameNode 机器需要升级,包括软件、硬件升级,此时集群也将无法使用。

5、HDFS HA 功能通过配置 Active/Standby 两个 NameNode 实现在集群中对 NameNode 的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode 很快的切换到另外一台机器。



二、HDFS-HA 介绍



2.1 HDFS-HA 工作要点

1、元数据管理方式需要改变

内存中各自保存一份元数据,Edits 日志只有 Active 状态的 NameNode 节点可以做写操作,两个NameNode 都可以读取 Edits,共享的 Edits 放在一个共享存储中管理。

2、需要一个状态管理功能模块

实现了一个 zkfailover,常驻在每一个 namenode 所在的节点,每一个 zkfailover 负责监控自己所在 NameNode 节点,利用 zk 进行状态标识,当需要进行状态切换时,由 zkfailover 来负责切换,切换时需要防止 brain split 现象的发生。

3、必须保证两个 NameNode 之间能够 ssh 无密码登录。

4、隔离(Fence),即同一时刻仅仅只有一个 NameNode 对外提供服务。



2.2 HDFS-HA 自动故障转移工作机制

使用命令 hdfs haadmin 可以手动进行故障转移,但是在该模式下,即使现役 NameNode 已经失效,系统也不会自动从现役 NameNode 转移到待机 NameNode,所以我们要配置自动故障转移,自动故障转移为 HDFS 部署增加了两个新组件:ZooKeeper 和 ZKFailoverController(ZKFC)进程,ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。HA的自动故障转移依赖于ZooKeeper的以下功能:

1、故障检测:集群中的每个 NameNode 在 ZooKeeper 中维护了一个持久会话,如果机器崩溃,

ZooKeeper 中的会话将终止,ZooKeeper 通知另一个 NameNode 需要触发故障转移。

2、现役 NameNode 选择:ZooKeeper 提供了一个简单的机制用于唯一的选择一个节点为 active 状态。如果目前现役 NameNode 崩溃,另一个节点可能从 ZooKeeper 获得特殊的排外锁以表明它应该成为现役 NameNode。

3、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。故障转移进程与前面描述的手动故障转移相似,先将 down 掉的服务器状态变为 standby,然后本地 NameNode 转换为 active 状态。

在这里插入图片描述



三、 HDFS-HA 部署



3.1 环境准备

1、修改 ip

2、修改主机名与 ip 映射

3、关闭防火墙

4、ssh 免密登录

5、安装 jdk、hadoop 并配置环境变量



3.2 规划集群

hadoop101 hadoop102 hadoop103
NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
ZK ZK ZK
ResourceManager
NodeManager NodeManager NodeManager



3.3 配置 Zookeeper 集群

请参考另一篇文章:

Zookeeper分布式安装部署



3.4 配置 HDFS-HA 集群

1、配置 hadoop-env.sh

export JAVA_HOME=/opt/module/jdk1.8.0_144

2、配置 core-site.xml

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

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

3、配置 hdfs-site.xml

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

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

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

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

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

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

	<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
	<value>qjournal://hadoop101:8485;hadoop102:8485;hadoop103:8485/mycluster</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>/home/test/.ssh/id_rsa</value>
	</property>

	<!-- 声明journalnode服务器存储目录-->
	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/opt/module/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.pr



版权声明:本文为a1786742005原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。