0205-Hadoop HA

第一章 HA概述

  1. 所谓HA(High Available), 即高可用(7 * 24 小时不中断服务)
  2. 实现高可用最关键的策略是消除单点故障. HA严格来时应该区分为各个组件的HA机制, HDFS的HA和YARN的HA.
  3. Hadoop2.0 之前, 在HDFS集群中NameNode存在单点故障(SPOF)
  4. NameNode主要在以下两个方面影响HDFS集群
    NameNode机器发生意外, 如宕机, 集群将无法使用, 直到管理员重启
    NameNode机器需要升级, 包括软件, 硬件升级,此时集群也无法使用

HDFS HA功能通过配置Active/Standby两个NameNode实现集群中对NameNode的热备来解决上述问题. 如果出现故障, 如机器宕机, 这时可以通过此种方式将NameNode很快的切换到另外一台机器;

第二章 HDFS-HA工作机制

HA原理

2.1 HDFS-HA 工作要点

要解决的两个核心问题

  • 如何保证active和standby的状态一致 , 保证他们存储的是同一份元数据
  • 怎么做切换, 怎么快速地, 安全地(防止脑裂)进行切换.

为解决第一个问题:

  • 元数据管理方式需要改变

内存中各自保存一份元数据(DataNode向两个NameNode都要发送心跳);
Edits日志文件只有Active状态的NameNode节点可以做写操作;
两个NameNode都可以读取Edits
共享的Edits放在一个共享存储中管理(qjournal)

为解读第二个问题:

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

实现一个zkfailover, 常驻在每一个NameNode所在节点, 每一个zkfailover辅助监控自己所在NameNode节点, 利用zookeeper进行状态标识, 当需要进行状态切换时, 有zkFailover来负责切换, 切换时需要防止 split brain 现象的发生.

  • 必须保证两个NameNode之间能够SSH免密登录
  • 隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务

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

在这里插入图片描述

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

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

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状态。

第三章 HDFS-HA集群配置

HA配置

3.1 环境准备

  1. 修改IP
  2. 修改主机名及主机名和IP地址的映射
  3. 关闭防火墙
  4. SSH免密登录
  5. 安装JDK, 环境变量配置等

3.2 集群规划

node01node02node03
NameNodeNameNode
JournalNodeJournalNodeJournalNode
DataNodeDataNodeDataNode
ZKZKZK
ResourceManagerResourceManager
NodeManagerNodeManagerNodeManager

3.3 配置zookeeper集群

  1. 集群规划

在node01、node02和node03三个节点上部署Zookeeper。

  1. 解压安装

(1) 解压Zookeeper安装包到/opt/module/目录下
(2) 同步/opt/module/zookeeper-3.4.10目录内容到node02、node03

[yanlzh@node01 module]$ xsync zookeeper-3.4.10/
  1. 配置服务器编号

(1) 在/opt/module/zookeeper-3.4.10/这个目录下创建zkData

[yalzh@node01 zookeeper-3.4.10]$ mkdir -p zkData

(2) 在/opt/module/zookeeper-3.4.10/zkData目录下创建一个myid的文件

[yanlzh@node01 zkData]$ touch myid

(3) 编辑myid文件
在文件中添加与server对应的编号1
并分别在node02、node03上修改myid文件中内容为2、3

  1. 配置zoo.cfg文件

(1) zoo.cfg 中添加

dataDir=/opt/module/zookeeper-3.4.10/zkData
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888

(2) 分发zoo.cfg 文件

(3) 配置参数解读

server.A=B:C:D

A是一个数字,表示这个是第几号服务器;
集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
B是这个服务器的地址;
C是这个服务器Follower与集群中的Leader服务器交换信息的端口;
D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

  1. 集群操作
#! /bin/bash
case $1 in
"start"){
        for i in node01 node02 node03
        do
                echo " --------启动 $i zookeeper-------"        
                ssh $i "zkServer.sh start"
        done
        };;
"stop"){
        for i in node01 node02 node03
        do
                echo " --------关闭 $i zookeeper-------"
                ssh $i "zkServer.sh stop"
        done
        };;
esac

3.4 配置HDFS-HA集群

  1. 官方地址:
  2. 在opt目录下创建一个ha文件夹
[yanlzh@node01 opt]$ mkdir ha
  1. 将/opt/app/下的 hadoop-2.7.2拷贝到/opt/ha目录下
[yanlzh@node01 app]$ cp -r hadoop-2.7.2/ /opt/ha/
  1. 配置hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
  1. 配置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/ha/hadoop-2.7.2/data/tmp</value>
		</property>
</configuration>
  1. 配置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>node01:9000</value>
	</property>

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

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

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

	<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
	<value>qjournal://node01:8485;node02:8485;node03: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/atguigu/.ssh/id_rsa</value>
	</property>

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

  1. 拷贝配置好的hadoop环境到其他节点

3.5 启动HDFS-HA集群

  1. 在各个JournalNode节点上, 输入以下命令启动JournalNode服务
[yanlzh@node01 hadoop-2.7.2]$ sbin/hadoop-daemons.sh start journalnode
  1. 在[nn1] 上, 对其进行格式化, 并启动
[yanlzh@node01 hadoop-2.7.2]$ bin/hdfs namenode -format
[yanlzh@node01 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
  1. 在[nn2] 上, 同步nn1的元数据信息
[yanlzh@node02 hadoop-2.7.2]$ bin/hdfs namenode -bootstrapStandby
  1. 启动[nn2]
[yanlzh@node02 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
  1. 在[nn1]上, 启动所有的DataNode
[yanlzh@node01 hadoop-2.7.2]$ sbin/hadoop-daemons.sh start datanode
  1. 将[nn1]切换为Active
[yanlzh@node01 hadoop-2.7.2]$ bin/hdfs haadmin -transitionToActive nn1
  1. 查看是否为Active
[yanlzh@node01 hadoop-2.7.2]$ bin/hdfs haadmin -getServiceState nn1

3.6 配置HDFS-HA自动故障转移

  1. 具体配置

(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>node01:2181,node02:2181,node03:2181</value>
</property>
  1. 启动

(1) 关闭所有HDFS服务

[yanlzh@node01 hadoop-2.7.2]$ sbin/stop-dfs.sh

(2) 启动ZK集群

[yanlzh@node01 hadoop-2.7.2]$ zk.sh start

(3) 初始化HA在Zookeeper中的状态

[yanlzh@node01 hadoop-2.7.2]$ bin/hdfs zkfc -formatZK

(4) 启动HDFS服务

[yanlzh@node01 hadoop-2.7.2]$ sbin/start-dfs.sh
  1. 验证

第四章 YARN_HA集群配置

4.1 配置

  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>node01</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>node02</value>
    </property>
 
    <!--指定zookeeper集群的地址--> 
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>node01:2181,node01:2181,node03: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>

  1. 同步更新其他节点的配置信息
xsync yarn-site.xml

4.2 启动

[yanlzh@node01 hadoop-2.7.2]$ sbin/start-yarn.sh
[yanlzh@node02 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager

第五章 HDFS Federation架构设计

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值