第1章 HA高可用

1.1 HA概述

1)所谓HA(high available),即高可用(7*24小时不中断服务)。

2)实现高可用最关键的策略是消除单点故障(single point of failure,SPOF)。单点故障是一个组件发生故障,就会导致整个系统无法运行。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。

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

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

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

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

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

1.2 工作机制

配置两个namenode,通过双namenode消除单点故障。

1.3 HDFS-HA手动故障转移

1.3.1 工作要点

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

内存中各自保存一份元数据;

Edits日志只有Active状态的namenode节点可以做写操作;

两个namenode都可以读取edits;

共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现);

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

3)隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务,防止脑裂(split-brain)

1.3.2 环境准备

1)修改IP

2)修改主机名及主机名和IP地址的映射

3)关闭防火墙

4)ssh免密登录

5)安装JDK,配置环境变量等

1.3.3 规划集群

hadoop102

hadoop103

hadoop104

HDFS

NameNode

DataNode

JournalNode

NameNode

DataNode

JournalNode

DataNode

JournalNode

YARN

NodeManager

ResourceManager

NodeManager

NodeManager

1.3.4 配置HDFS-HA集群

1)官方地址:http://hadoop.apache.org/

2)在/opt/module/目录下创建一个HA文件夹

mkdir HA

3)将/opt/module/下的 hadoop-2.7.2拷贝到/opt/module/HA目录下

[atguigu@hadoop102 module]$ cp -r hadoop-2.7.2/ /opt/module/HA/

4)配置hadoop-env.sh

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

5)配置core-site.xml

<configuration>

<!-- 把两个NameNode的地址组装成一个集群mycluster -->

<property>

<name>fs.defaultFS</name>

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

</property>

<!-- 声明journalnode服务本地文件系统存储目录-->

<property>

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

<value>/opt/module/HA/hadoop-2.7.2/data/jn</value>

</property>

<!-- 指定hadoop运行时产生文件的存储目录 -->

<property>

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

<value>/opt/module/HA/hadoop-2.7.2/data/tmp</value>

</property>

</configuration>

6)配置hdfs-site.xml

<configuration>

<!-- 完全分布式集群名称 -->

<property>

<name>dfs.nameservices</name>

<value>mycluster</value>

</property>

<!-- 该nameservice下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>hadoop102:8020</value>

</property>

<!-- nn2的RPC通信地址 -->

<property>

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

<value>hadoop103:8020</value>

</property>

<!-- nn1的http通信地址 -->

<property>

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

<value>hadoop102:50070</value>

</property>

<!-- nn2的http通信地址 -->

<property>

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

<value>hadoop103:50070</value>

</property>

<!-- 指定NameNode元数据在JournalNode上的存放位置 -->

<property>

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

<value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104: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>

<!-- 关闭权限检查-->

<property>

<name>dfs.permissions.enable</name>

<value>false</value>

</property>

<!-- 客户端访问代理类:客户端通过该类判断哪个namenode是active -->

<property>

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

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

</property>

</configuration>

7)拷贝配置好的hadoop环境到其他节点

1.3.5 启动HDFS-HA集群

1)在各个JournalNode节点上,输入以下命令启动journalnode服务:

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start journalnode

2)在[nn1]上,对其进行格式化,并启动:

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -format

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

3)在[nn2]上,同步nn1的元数据信息:

[atguigu@hadoop103 hadoop-2.7.2]$ bin/hdfs namenode -bootstrapStandby

4)启动[nn2]:

[atguigu@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

5)查看web页面显示

6)在[nn1]上,启动所有datanode

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemons.sh start datanode

7)将[nn1]切换为Active

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs haadmin -transitionToActive nn1

8)查看是否Active

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs haadmin -getServiceState nn1

1.4 HDFS-HA自动故障转移

1.4.1工作要点

前面学习了使用命令hdfs haadmin -failover手动进行故障转移,在该模式下,即使现役NameNode已经失效,系统也不会自动从现役NameNode转移到待机NameNode,下面学习如何配置部署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认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。

2ZooKeeper会话管理:当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。

3)基于ZooKeeper的选择:如果本地NameNode是健康的,且ZKFC发现没有其它的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地NameNode为active。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役NameNode,然后本地NameNode转换为active状态。

1.4.2 规划集群

hadoop102

hadoop103

hadoop104

HDFS

NameNode

DataNode

JournalNode

ZKFC

NameNode

DataNode

JournalNode

ZKFC

DataNode

JournalNode

YARN

NodeManager

ResourceManager

NodeManager

NodeManager

Zookeeper

Zookeeper

Zookeeper

Zookeeper

1.4.3 配置Zookeeper集群

0)集群规划

在hadoop102、hadoop103和hadoop104三个节点上部署Zookeeper。

1)解压安装

(1)解压zookeeper安装包到/opt/module/目录下

[atguigu@hadoop102 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/

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

[atguigu@hadoop102 zookeeper-3.4.10]$ mkdir -p zkData

(3)重命名/opt/module/zookeeper-3.4.10/conf这个目录下的zoo_sample.cfg为zoo.cfg

[atguigu@hadoop102 conf]$ mv zoo_sample.cfg zoo.cfg

2)配置zoo.cfg文件

(1)具体配置

dataDir=/opt/module/zookeeper-3.4.10/zkData

增加如下配置

#######################cluster##########################

server.2=hadoop102:2888:3888

server.3=hadoop103:2888:3888

server.4=hadoop104:2888:3888

(2)配置参数解读

Server.A=B:C:D。

A是一个数字,表示这个是第几号服务器;

B是这个服务器的ip地址;

C是这个服务器与集群中的Leader服务器交换信息的端口;

D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。

3)集群操作

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

[atguigu@hadoop102 zkData]$ touch myid

添加myid文件,注意一定要在linux里面创建,在notepad++里面很可能乱码

(2)编辑myid文件

[atguigu@hadoop102 zkData]$ vi myid

在文件中添加与server对应的编号:如2

(3)拷贝配置好的zookeeper到其他机器上

[atguigu@hadoop102 zkData]$ scp -r zookeeper-3.4.10/ hadoop103:/opt/module/

[atguigu@hadoop102 zkData]$ scp -r zookeeper-3.4.10/ hadoop104:/opt/module/

并分别修改myid文件中内容为3、4

(4)分别启动zookeeper

[atguigu@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh start

[atguigu@hadoop103 zookeeper-3.4.10]$ bin/zkServer.sh start

[atguigu@hadoop104 zookeeper-3.4.10]$ bin/zkServer.sh start

(5)查看状态

[atguigu@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh status

JMX enabled by default

Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg

Mode: follower

[atguigu@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh status

JMX enabled by default

Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg

Mode: leader

[atguigu@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh status

JMX enabled by default

Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg

Mode: follower

1.4.4 配置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>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>

</property>

注意:记得分发配置文件

2)启动

(1)关闭所有HDFS服务:

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/stop-dfs.sh

(2)启动Zookeeper集群:

[atguigu@hadoop102 hadoop-2.7.2]$ bin/zkServer.sh start

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

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs zkfc -formatZK

(4)启动HDFS服务:

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh

(5)在各个NameNode节点上启动DFSZK Failover Controller,先在哪台机器启动,哪个机器的NameNode就是Active NameNode

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start zkfc

说明:如果使用start-dfs.sh启动集群,不需要单独启动zkfc

3)验证:将Active NameNode进程kill

[atguigu@hadoop102 hadoop-2.7.2]$ kill -9 namenode的进程id

1.5 YARN-HA配置

1.5.1 YARN-HA工作机制

1)官方文档:

http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

2)YARN-HA工作机制

1.5.2 配置YARN-HA集群

0)环境准备

(1)修改IP

(2)修改主机名及主机名和IP地址的映射

(3)关闭防火墙

(4)ssh免密登录

(5)安装JDK,配置环境变量等

(6)配置Zookeeper集群

1)规划集群

hadoop102

hadoop103

hadoop104

HDFS

NameNode

DataNode

JournalNode

ZKFC

NameNode

DataNode

JournalNode

ZKFC

DataNode

JournalNode

YARN

ResourceManager

NodeManager

ResourceManager

NodeManager

NodeManager

Zookeeper

Zookeeper

Zookeeper

Zookeeper

2)具体配置

(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>hadoop102</value>

</property>

<property>

<name>yarn.resourcemanager.hostname.rm2</name>

<value>hadoop103</value>

</property>

<!--指定zookeeper集群的地址-->

<property>

<name>yarn.resourcemanager.zk-address</name>

<value>hadoop102:2181,hadoop103:2181,hadoop104: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)启动hdfs

(1)在各个JournalNode节点上,输入以下命令启动journalnode服务:

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start journalnode

(2)在[nn1]上,对其进行格式化,并启动:

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -format

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

(3)在[nn2]上,同步nn1的元数据信息:

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -bootstrapStandby

(4)启动[nn2]:

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

(5)启动所有datanode

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemons.sh start datanode

(6)将[nn1]切换为Active

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs haadmin -transitionToActive nn1

4)启动yarn

(1)在hadoop102中执行:

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-yarn.sh

(2)在hadoop103中执行:

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager

(3)查看服务状态

[atguigu@hadoop102 hadoop-2.7.2]$ bin/yarn rmadmin -getServiceState rm1

1.6 HDFS Federation架构设计

1) NameNode架构的局限性

(1)Namespace(命名空间)的限制

由于NameNode在内存中存储所有的元数据(metadata),因此单个namenode所能存储的对象(文件+块)数目受到namenode所在JVM的heap size的限制。50G的heap能够存储20亿(200million)个对象,这20亿个对象支持4000个datanode,12PB的存储(假设文件平均大小为40MB)。随着数据的飞速增长,存储的需求也随之增长。单个datanode从4T增长到36T,集群的尺寸增长到8000个datanode。存储的需求从12PB增长到大于100PB。

(2)隔离问题

由于HDFS仅有一个namenode,无法隔离各个程序,因此HDFS上的一个实验程序就很有可能影响整个HDFS上运行的程序。

(3)性能的瓶颈

由于是单个namenode的HDFS架构,因此整个HDFS文件系统的吞吐量受限于单个namenode的吞吐量。

2)HDFS Federation架构设计

能不能有多个NameNode

NameNode NameNode NameNode

元数据 元数据 元数据

Log machine 电商数据/话单数据

3)HDFS Federation应用思考

不同应用可以使用不同NameNode进行数据管理

图片业务、爬虫业务、日志审计业务

Hadoop生态系统中,不同的框架使用不同的namenode进行管理namespace。(隔离性)

【大数据】Hadoop的高可用HA的更多相关文章

  1. CDH构建大数据平台-Kerberos高可用部署【完结篇】

    CDH构建大数据平台-Kerberos高可用部署[完结篇] 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.安装Kerberos相关的软件包并同步配置文件 1>.实验环境 ...

  2. hadoop学习笔记(七):hadoop2.x的高可用HA(high avaliable)和联邦F(Federation)

    Hadoop介绍——HA与联邦 0.1682019.06.04 13:30:55字数 820阅读 138 Hadoop 1.0中HDFS和MapReduce在高可用.扩展性等方面存在问题: –HDFS ...

  3. hadoop在zookeeper上的高可用HA

    (参考文章:https://www.linuxprobe.com/hadoop-high-available.html) 一.技术背景 影响HDFS集群不可用主要包括以下两种情况:一是NameNode ...

  4. Hadoop 高可用(HA)的自动容灾配置

    参考链接 Hadoop 完全分布式安装 ZooKeeper 集群的安装部署 0. 说明 在 Hadoop 完全分布式安装 & ZooKeeper 集群的安装部署的基础之上进行 Hadoop 高 ...

  5. Hadoop记录-Hadoop NameNode 高可用 (High Availability) 实现解析

    Hadoop NameNode 高可用 (High Availability) 实现解析   NameNode 高可用整体架构概述 在 Hadoop 1.0 时代,Hadoop 的两大核心组件 HDF ...

  6. 我要进大厂之大数据Hadoop HDFS知识点(2)

    01 我们一起学大数据 老刘继续分享出Hadoop中的HDFS模块的一些高级知识点,也算是对今天复习的HDFS内容进行一次总结,希望能够给想学大数据的同学一点帮助,也希望能够得到大佬们的批评和指点! ...

  7. 浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)

    1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 ...

  8. 浅谈web应用的负载均衡、集群、高可用(HA)解决方案

    http://aokunsang.iteye.com/blog/2053719   声明:以下仅为个人的一些总结和随写,如有不对之处,还请看到的网友指出,以免误导. (详细的配置方案请google,这 ...

  9. web应用的负载均衡、集群、高可用(HA)解决方案

    看看别人的文章: 1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代 ...

随机推荐

  1. h5 和之前版本的区别

    html5和之前版本的区别就是:以前版本多采用<tr><td>等标签,对于webapp的开发不是很好把控.H5采用<div>等标签直接进行布局(且多了许多标签功能很 ...

  2. Windows下Redis集群搭建

    1.第一步先安装Redis 参照<Windows下Redis安装及使用.docx> 在Redis目录E:/Redis下新建Logs文件夹,并且创建3个端口下的配置文件,记得修改里面的接口 ...

  3. 【LeetCode算法题库】Day3:Reverse Integer & String to Integer (atoi) & Palindrome Number

    [Q7]  把数倒过来 Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Outpu ...

  4. Lwip:原生态的Linux socket应用如何移植到Lwip上

    lwIP - A Lightweight TCP/IP stack 在上一篇中,我们了解到在OpenFastPath上如何移植原生态的Linux Socket应用程序,那么,对于另外一个老牌的小型TC ...

  5. Netty源码分析第3章(客户端接入流程)---->第2节: 处理接入事件之handle的创建

    Netty源码分析第三章: 客户端接入流程 第二节: 处理接入事件之handle的创建 上一小节我们剖析完成了与channel绑定的ChannelConfig初始化相关的流程, 这一小节继续剖析客户端 ...

  6. 三羊献瑞:dfs / next_permutation()

    三羊献瑞 观察下面的加法算式: 祥 瑞 生 辉  +   三 羊 献 瑞-------------------   三 羊 生 瑞 气 (如果有对齐问题,可以参看[图1.jpg]) 其中,相同的汉字代 ...

  7. RabbitMQ理论部分

    概念 queue        队列 exchange   交换机 bind          绑定 channel     通道 一个发送消息流程包含上述四个概念.消息经过channel传递给exc ...

  8. Python文本文件的输入输出操作学习

    Python具有基本的文本文件读写功能.Python的标准库提供有更丰富的读写功能. 文本文件的读写主要通过open()所构建的文件对象来实现. 创建文件对象 我们打开一个文件,并使用一个对象来表示该 ...

  9. 分布式日志收集收集系统:Flume(转)

    Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统.支持在系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力.Fl ...

  10. 随手记录-linux-常用命令

    转自:https://www.cnblogs.com/yjd_hycf_space/p/7730690.html linux目录结构:http://www.cnblogs.com/fat39/p/72 ...