Hadoop详解(10) - Hadoop HA高可用

HA概述

HA(High Availablity),即高可用(7*24小时不中断服务)。

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

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

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

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

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

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

HDFS-HA工作机制:通过多个NameNode消除单点故障

HDFS-HA工作要点

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

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

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

所有的NameNode都可以读取Edits;

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

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

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

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

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

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。

HDFS-HA故障转移机制

Hadoop-HA环境准备

  • 修改IP

192.168.194.102 hadoop102

192.168.194.103 hadoop103

192.168.194.104 hadoop104

  • 安装必要环境

yum install -y epel-release

yum install -y psmisc nc net-tools rsync vim lrzsz ntp libzstd openssl-static tree iotop git

  • 修改主机名

hostnamectl --static set-hostname hadoop102

  • 主机名和IP地址的映射

vi /etc/hosts

192.168.194.102 hadoop102

192.168.194.103 hadoop103

192.168.194.104 hadoop104

  • 关闭防火墙,关闭防火墙开机自启

systemctl stop firewalld

systemctl disable firewalld

  • 配置hadoop用户具有root权限,方便后期加sudo执行root权限的命令

vim /etc/sudoers

修改/etc/sudoers文件,找到下面一行(91行),在root下面添加一行,如下所示:

## Allow root to run any commands anywhere

root    ALL=(ALL)       ALL

hadoop   ALL=(ALL)     NOPASSWD:ALL

  • 在/opt目录下创建文件夹,并修改所属主和所属组

在/opt目录下创建module、software文件夹

[root@hadoop102 ~]# mkdir /opt/module

[root@hadoop102 ~]# mkdir /opt/software

修改module、software文件夹的所有者和所属组均为hadoop用户

[root@hadoop102 ~]# chown hadoop:hadoop /opt/module

[root@hadoop102 ~]# chown hadoop:hadoop /opt/software

修改module、software文件夹的权限

[root@hadoop102 opt]# cd /opt/

[root@hadoop102 opt]# chmod -R 777 module/ software/

  • ssh免密登录

ssh-keygen

执行ssh-keygen连按4个回车

拷贝密匙到所有服务器

hadoop@hadoop102 ~]$ ssh-copy-id hadoop102

[hadoop@hadoop102 ~]$ ssh-copy-id hadoop103

[hadoop@hadoop102 ~]$ ssh-copy-id hadoop104

  • 卸载虚拟机自带的open JDK并安装jdk1.8

查询已安装Java软件

[root@hadoop102 opt]$ rpm -qa | grep java

卸载该JDK:

[root@hadoop102 opt]$ sudo rpm -e jdk的软件包名称

解压JDK到/opt/module目录下

[root@hadoop102 software]# tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/

修改/etc/profile文件

[root@hadoop102 software]# vi /etc/profile

在文件末尾添加如下内容

#JAVA_HOME

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

export PATH=$PATH:$JAVA_HOME/bin

保存后退出

:wq

source一下/etc/profile文件,让新的环境变量PATH生效

[root@hadoop102 software]# source /etc/profile

测试JDK是否安装成功

[root@hadoop102 software]# java -version

Hadoop-HA规划集群

hadoop102     hadoop103     hadoop104

NameNode    NameNode    NameNode

ZKFC    ZKFC    ZKFC

JournalNode    JournalNode    JournalNode

DataNode    DataNode    DataNode

ZK    ZK    ZK

ResourceManager

NodeManager    NodeManager    NodeManager

配置Zookeeper集群

1)集群规划

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

2)解压安装

切换hadoop用户(安装ha过程都使用普通用户hadoop进行)

(1)官网下载Zookeeper

Zookeeper存档各版本地址:https://archive.apache.org/dist/zookeeper/

Zookeeper 3.5.7版本下载地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz

(2)解压Zookeeper安装包到/opt/module/目录下

[hadoop@hadoop102 software]$ tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/

(3)重命名解压解压目录

[hadoop@hadoop102 software]$ cd /opt/module/

[hadoop@hadoop102 module]$ mv apache-zookeeper-3.5.7-bin/ zookeeper-3.5.7

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

[hadoop@hadoop102 module]$ cd zookeeper-3.5.7/

[hadoop@hadoop102 zookeeper-3.5.7]$ mkdir zkData

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

[hadoop@hadoop102 zookeeper-3.5.7]$ cd conf/

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

3)配置zoo.cfg文件

(1)具体配置

修改dataDir

dataDir=/opt/module/zookeeper-3.5.7/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。

4)集群操作

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

[hadoop@hadoop102 zkData]$ touch myid

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

(2)编辑myid文件

[hadoop@hadoop102 zkData]$ vi myid

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

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

[hadoop@hadoop102 module]$ cd /opt/module/

[hadoop@hadoop102 module]$ scp -r zookeeper-3.5.7/ hadoop@hadoop103:/opt/module/

[hadoop@hadoop102 module]$ scp -r zookeeper-3.5.7/ hadoop@hadoop104:/opt/module/

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

(4)分别启动zookeeper

[hadoop@hadoop102 module]$ cd /opt/module/zookeeper-3.5.7/

[hadoop@hadoop102 zookeeper-3.5.7]$ bin/zkServer.sh start

[hadoop@hadoop103 zkData]$ cd /opt/module/zookeeper-3.5.7/

[hadoop@hadoop103 zookeeper-3.5.7]$ bin/zkServer.sh start

[hadoop@hadoop104 zkData]$ cd /opt/module/zookeeper-3.5.7/

[hadoop@hadoop104 zookeeper-3.5.7]$ bin/zkServer.sh start

(5)查看状态

[hadoop@hadoop102 zookeeper-3.5.7]$ bin/zkServer.sh status

ZooKeeper JMX enabled by default

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

Client port found: 2181. Client address: localhost.

Mode: follower

[hadoop@hadoop103 zookeeper-3.5.7]$ bin/zkServer.sh status

ZooKeeper JMX enabled by default

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

Client port found: 2181. Client address: localhost.

Mode: follower

[hadoop@hadoop104 zookeeper-3.5.7]$ bin/zkServer.sh status

ZooKeeper JMX enabled by default

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

Client port found: 2181. Client address: localhost.

Mode: leader

配置HDFS-HA集群

官方HA文档地址:https://hadoop.apache.org/docs/r3.1.3/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

  • 在opt目录下创建一个ha文件夹

为了和单几点的NameNode区分开来,这里将HA集群安装到/opt/ha/ 目录,

默认/opt 为root权限,所以在/opt目录下创建文件夹需要sudo并修改所属用户和组

[hadoop@hadoop102 ~]$ cd /opt/

[hadoop@hadoop102 opt]$ sudo mkdir ha

[hadoop@hadoop102 opt]$ sudo chown hadoop:hadoop /opt/ha/

分别在hadoop103 和 hadoop104上的/opt/ 目录下页创建ha目录

  • 上传解压

将hadoop-3.1.3.tar.gz文件上传到服务器的/opt/software/ 目录并解压到/opt/ha/ 目录下

[hadoop@hadoop102 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/ha/

  • 配置hadoop-env.sh

    [hadoop@hadoop102 software]$ cd /opt/ha/hadoop-3.1.3/etc/hadoop/

    [hadoop@hadoop102 hadoop]$ vi hadoop-env.sh

找到已经注释了"export JAVA_HOME"的代码行,写入对应的JAVA_HOME变量值

# The java implementation to use. By default, this environment

# variable is REQUIRED on ALL platforms except OS X!

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

  • 配置core-site.xml

    <?xml version="1.0" encoding="UTF-8"?>

    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

    <configuration>

    <!-- 指定NameNode的地址 -->

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

    <!-- 非HA模式时该值一般使用
    主机名:端口,HA模式下为了能够动态切换则需要使用虚拟主机名 -->

    <property>

    <name>fs.defaultFS</name>

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

    </property>

    <!-- 指定hadoop数据的存储目录 -->

    <property>

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

    <value>/opt/ha/hadoop-3.1.3/data</value>

    </property>

    <!—- 其余配置和非HA模式一样 -->

    <!-- 配置HDFS网页登录使用的静态用户为hadoop -->

    <property>

    <name>hadoop.http.staticuser.user</name>

    <value>hadoop</value>

    </property>

    <!-- 配置该hadoop(superUser)允许通过代理访问的主机节点 -->

    <property>

    <name>hadoop.proxyuser.hadoop.hosts</name>

    <value>*</value>

    </property>

    <!-- 配置该hadoop(superUser)允许通过代理用户所属组 -->

    <property>

    <name>hadoop.proxyuser.hadoop.groups</name>

    <value>*</value>

    </property>

    <!-- 配置该hadoop(superUser)允许通过代理的用户-->

    <property>

    <name>hadoop.proxyuser.hadoop.groups</name>

    <value>*</value>

    </property>

    </configuration>

  • 配置hdfs-site.xml

    <?xml version="1.0" encoding="UTF-8"?>

    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

    <configuration>

    <!-- NameNode数据存储目录 -->

    <property>

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

    <value>file://${hadoop.tmp.dir}/name</value>

    </property>

    <!-- DataNode数据存储目录 -->

    <property>

    <name>dfs.datanode.data.dir</name>

    <value>file://${hadoop.tmp.dir}/data</value>

    </property>

    <!-- JournalNode数据存储目录 -->

    <property>

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

    <value>${hadoop.tmp.dir}/jn</value>

    </property>

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

    <property>

    <name>dfs.nameservices</name>

    <value>mycluster</value>

    </property>

    <!-- 集群中NameNode节点都有哪些 -->

    <property>

    <name>dfs.ha.namenodes.mycluster</name>

    <value>nn1,nn2,nn3</value>

    </property>

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

    <property>

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

    <value>hadoop102:8020</value>

    </property>

    <property>

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

    <value>hadoop103:8020</value>

    </property>

    <property>

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

    <value>hadoop104:8020</value>

    </property>

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

    <property>

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

    <value>hadoop102:9870</value>

    </property>

    <property>

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

    <value>hadoop103:9870</value>

    </property>

    <property>

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

    <value>hadoop104:9870</value>

    </property>

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

    <property>

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

    <value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value>

    </property>

    <!-- 访问代理类:client用于确定哪个NameNode为Active -->

    <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>shell(/bin/true)</value>

    </property>

    <!-- 使用隔离机制时需要ssh秘钥登录-->

    <property>

    <name>dfs.ha.fencing.ssh.private-key-files</name>

    <value>/home/hadoop/.ssh/id_rsa</value>

    </property>

    </configuration>

  • 配置works

    [hadoop@hadoop102 hadoop]$ vi workers

清空原来的内容,添加如下内容

hadoop102

hadoop103

hadoop104

  • 分发配置好的hadoop环境到其他节点

    [hadoop@hadoop102 hadoop]$ cd /opt/ha/

    [hadoop@hadoop102 ha]$ scp -r hadoop-3.1.3/ hadoop103:/opt/ha/

    [hadoop@hadoop102 ha]$ scp -r hadoop-3.1.3/ hadoop104:/opt/ha/

  • 配置HADOOP_HOME环境变量

分别在三个节点上配置HADOOP_HOME环境变量

[hadoop@hadoop102 ~]$ sudo vi /etc/profile

将如下内容添加到文件末尾

##HADOOP_HOME

export HADOOP_HOME=/opt/ha/hadoop-3.1.3

export PATH=$PATH:$HADOOP_HOME/bin

export PATH=$PATH:$HADOOP_HOME/sbin

重新加载环境变量

[hadoop@hadoop102 ~]$ source /etc/profile

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

    [hadoop@hadoop102 ~]$ hdfs --daemon start journalnode

    [hadoop@hadoop103 ~]$ hdfs --daemon start journalnode

    [hadoop@hadoop104 ~]$ hdfs --daemon start journalnode

jps查看启动进程

[hadoop@hadoop102 ~]$ jps

3456 Jps

2472 QuorumPeerMain

3417 JournalNode

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

    [hadoop@hadoop102 hadoop-3.1.3]$ hdfs namenode –format

    [hadoop@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode

  • 在[nn2]和[nn3]上,同步nn1的元数据信息

    [hadoop@hadoop103 hadoop-3.1.3]$ hdfs namenode -bootstrapStandby

    [hadoop@hadoop104 hadoop-3.1.3]$ hdfs namenode –bootstrapStandby

同步nn1的元数据信息在hadoop103和hadoop104上同时执行,因为在hadoop103上同步hadoop102元数据信息时也会请求hadoop104的服务。

  • 启动[nn2]和[nn3]

    [hadoop@hadoop103 hadoop-3.1.3]$ hdfs --daemon start namenode

    [hadoop@hadoop104 hadoop-3.1.3]$ hdfs --daemon start namenode

  • 查看web页面显示

  • 在所有节点上,启动datanode

    [hadoop@hadoop102 hadoop-3.1.3]$ hdfs --daemon start datanode

    [hadoop@hadoop103 hadoop-3.1.3]$ hdfs --daemon start datanode

    [hadoop@hadoop104 hadoop-3.1.3]$ hdfs --daemon start datanode

  • 将[nn1]切换为Active

    [hadoop@hadoop102 hadoop-3.1.3]$ hdfs haadmin -transitionToActive nn1

  • 查看是否Active

    [hadoop@hadoop102 hadoop-3.1.3]$ hdfs haadmin -getServiceState nn1

    active

配置HDFS-HA自动故障转移

  • 添加配置

(1)在hdfs-site.xml中增加

<!-- 启用nn故障自动转移 -->

<property>

<name>dfs.ha.automatic-failover.enabled</name>

<value>true</value>

</property>

(2)在core-site.xml文件中增加

<!-- 指定zkfc要连接的zkServer地址 -->

<property>

<name>ha.zookeeper.quorum</name>

<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>

</property>

(3)修改后分发配置文件

[hadoop@hadoop102 hadoop]$ scp hdfs-site.xml core-site.xml hadoop103:/opt/ha/hadoop-3.1.3/etc/hadoop/

[hadoop@hadoop102 hadoop]$ scp hdfs-site.xml core-site.xml hadoop104:/opt/ha/hadoop-3.1.3/etc/hadoop/

  • 启动集群

(1)关闭所有HDFS服务:

[hadoop@hadoop102 hadoop]$ stop-dfs.sh

## 还没有在workers中配置从节点的名称,另外两个的datanode进程需要单独执行命令停止

[hadoop@hadoop103 ~]$ hdfs --daemon stop datanode

[hadoop@hadoop104 ~]$ hdfs --daemon stop datanode

(2)启动Zookeeper集群:

[hadoop@hadoop102 zookeeper-3.5.7]$ bin/zkServer.sh start

[hadoop@hadoop103 zookeeper-3.5.7]$ bin/zkServer.sh start

[hadoop@hadoop104 zookeeper-3.5.7]$ bin/zkServer.sh start

(3)启动Zookeeper以后,然后再初始化HA在Zookeeper中状态:

[hadoop@hadoop102 hadoop]$ hdfs zkfc -formatZK

(4)启动HDFS服务:

[atguigu@hadoop102 ~]$ start-dfs.sh

(5)可以在zkCli.sh客户端查看Namenode选举锁节点内容:

[hadoop@hadoop102 zookeeper-3.5.7]$ bin/zkCli.sh

[zk: localhost:2181(CONNECTED) 0] get -s /hadoop-ha/mycluster/ActiveStandbyElectorLock

myclusternn1 hadoop102 �>(�>

cZxid = 0x100000008

ctime = Tue Dec 14 09:53:51 CST 2021

mZxid = 0x100000008

mtime = Tue Dec 14 09:53:51 CST 2021

pZxid = 0x100000008

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x40000734ab00000

dataLength = 33

numChildren = 0

  • 验证

将Active NameNode进程kill,查看网页端三台Namenode的状态变化

[hadoop@hadoop102 hadoop]$ jps

10549 Jps

2472 QuorumPeerMain

10056 JournalNode

9741 NameNode

9854 DataNode

10223 DFSZKFailoverController

[hadoop@hadoop102 hadoop]$ kill 9741

hadoop103节点变为active状态

重新启动hdfs,启动kill掉的程序,状态变为standby

[hadoop@hadoop102 hadoop]$ start-dfs.sh

在集群中,执行start-dfs.sh 或 start-yarn.sh命令时,会检查集群中配置的NameNode,DateNode,ResourceManager,NodeManager进程是否启动,若没启动则会启动,若已经启动则会跳过,不会出现重复启动的情况

YARN-HA配置

官方HA文档地址:http://hadoop.apache.org/docs/r3.1.3/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

  • YARN-HA工作机制

  • 配置yarn-site.xml

    <?xml version="1.0"?>

    <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>

    <!--指定resourcemanager的逻辑列表-->

    <property>

    <name>yarn.resourcemanager.ha.rm-ids</name>

    <value>rm1,rm2</value>

    </property>

    <!-- ========== rm1的配置 ========== -->

    <!-- 指定rm1的主机名 -->

    <property>

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

    <value>hadoop102</value>

    </property>

    <!-- 指定rm1的web端地址 -->

    <property>

    <name>yarn.resourcemanager.webapp.address.rm1</name>

    <value>hadoop102:8088</value>

    </property>

    <!-- 指定rm1的内部通信地址 -->

    <property>

    <name>yarn.resourcemanager.address.rm1</name>

    <value>hadoop102:8032</value>

    </property>

    <!-- 指定AM向rm1申请资源的地址 -->

    <property>

    <name>yarn.resourcemanager.scheduler.address.rm1</name>

    <value>hadoop102:8030</value>

    </property>

    <!-- 指定供NM连接的地址 -->

    <property>

    <name>yarn.resourcemanager.resource-tracker.address.rm1</name>

    <value>hadoop102:8031</value>

    </property>

    <!-- ========== rm2的配置 ========== -->

    <!-- 指定rm2的主机名 -->

    <property>

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

    <value>hadoop103</value>

    </property>

    <property>

    <name>yarn.resourcemanager.webapp.address.rm2</name>

    <value>hadoop103:8088</value>

    </property>

    <property>

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

    <value>hadoop103:8032</value>

    </property>

    <property>

    <name>yarn.resourcemanager.scheduler.address.rm2</name>

    <value>hadoop103:8030</value>

    </property>

    <property>

    <name>yarn.resourcemanager.resource-tracker.address.rm2</name>

    <value>hadoop103:8031</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>

    <!-- 环境变量的继承 -->

    <property>

    <name>yarn.nodemanager.env-whitelist</name>

    <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>

    </property>

    </configuration>

  • 配置MapReduce程序运行在Yarn上

    vim mapred-site.xml

文件内容:

<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

<!-- 指定MapReduce程序运行在Yarn上 -->

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

</configuration>

  • 修改后分发配置文件

    [hadoop@hadoop102 hadoop]$ scp yarn-site.xml hadoop103:/opt/ha/hadoop-3.1.3/etc/hadoop/

    [hadoop@hadoop102 hadoop]$ scp yarn-site.xml hadoop104:/opt/ha/hadoop-3.1.3/etc/hadoop/

    [hadoop@hadoop102 hadoop]$ scp mapred-site.xml hadoop103:/opt/ha/hadoop-3.1.3/etc/hadoop/

    [hadoop@hadoop102 hadoop]$ scp mapred-site.xml hadoop104:/opt/ha/hadoop-3.1.3/etc/hadoop/

  • 启动YARN

在hadoop102或者hadoop103中执行:

[hadoop@hadoop102 hadoop]$ start-yarn.sh

查看服务状态

[hadoop@hadoop102 hadoop]$ yarn rmadmin -getServiceState rm1

standby

[hadoop@hadoop102 hadoop]$ yarn rmadmin -getServiceState rm2

active

在zkCli.sh客户端查看ResourceManager选举锁节点内容:

[zk: localhost:2181(CONNECTED) 0] get -s /yarn-leader-election/cluster-yarn1/ActiveStandbyElectorLock

cluster-yarn1rm2

cZxid = 0x100000c06

ctime = Tue Dec 14 14:11:34 CST 2021

mZxid = 0x100000c06

mtime = Tue Dec 14 14:11:34 CST 2021

pZxid = 0x100000c06

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x20000ef31360123

dataLength = 20

numChildren = 0

web端查看hadoop102:8088和hadoop103:8088的YARN的状态

  • 验证

将Active ResourceManager进程kill,查看网页端的状态变化

HDFS Federation架构设计

  • 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的吞吐量。

  • HDFS Federation架构设计

能不能有多个NameNode

NameNode    NameNode    NameNode

元数据    元数据    元数据

Log    machine    电商数据/话单数据

图 HDFS Federation架构设计

  • HDFS Federation应用思考

不同应用可以使用不同NameNode进行数据管理图片业务、爬虫业务、日志审计业务。Hadoop生态系统中,不同的框架使用不同的NameNode进行管理NameSpace。(隔离性)

Hadoop详解(10) - Hadoop HA高可用的更多相关文章

  1. Hadoop 2、配置HDFS HA (高可用)

    前提条件 先搭建 http://www.cnblogs.com/raphael5200/p/5152004.html 的环境,然后在其基础上进行修改 一.安装Zookeeper 由于环境有限,所以在仅 ...

  2. redis详解(四)-- 高可用分布式集群

    一,高可用 高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响. 停止服务的原因可能由于网卡.路由器.机房.CPU负载过高.内存溢出.自然灾害等不可预期的原 ...

  3. Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建

    目录 目录 1.前言 1.1.什么是 Hadoop? 1.1.1.什么是 YARN? 1.2.什么是 Zookeeper? 1.3.什么是 Hbase? 1.4.什么是 Hive 1.5.什么是 Sp ...

  4. 大数据Hadoop的HA高可用架构集群部署

        1 概述 在Hadoop 2.0.0之前,一个Hadoop集群只有一个NameNode,那么NameNode就会存在单点故障的问题,幸运的是Hadoop 2.0.0之后解决了这个问题,即支持N ...

  5. Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)

    声明:作者原创,转载注明出处. 作者:帅气陈吃苹果 一.服务器环境 主机名 IP 用户名 密码 安装目录 master188 192.168.29.188 hadoop hadoop /home/ha ...

  6. hadoop 集群HA高可用搭建以及问题解决方案

    hadoop 集群HA高可用搭建 目录大纲 1. hadoop HA原理 2. hadoop HA特点 3. Zookeeper 配置 4. 安装Hadoop集群 5. Hadoop HA配置 搭建环 ...

  7. CentOS7+Hadoop2.7.2(HA高可用+Federation联邦)+Hive1.2.1+Spark2.1.0 完全分布式集群安装

    1 2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.9.1 2.9.2 2.9.2.1 2.9.2.2 2.9.3 2.9.3.1 2.9.3.2 2.9.3.3 2. ...

  8. 大数据技术之HA 高可用

    HDFS HA高可用 1.1 HA概述 1)所谓HA(High Available),即高可用(7*24小时不中断服务). 2)实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件的HA ...

  9. Spark入门:第2节 Spark集群安装:1 - 3;第3节 Spark HA高可用部署:1 - 2

    三. Spark集群安装 3.1 下载spark安装包 下载地址spark官网:http://spark.apache.org/downloads.html 这里我们使用 spark-2.1.3-bi ...

  10. Flink 集群搭建,Standalone,集群部署,HA高可用部署

    基础环境 准备3台虚拟机 配置无密码登录 配置方法:https://ipooli.com/2020/04/linux_host/ 并且做好主机映射. 下载Flink https://www.apach ...

随机推荐

  1. 前端枚举enum的应用(Element)封装

    什么是枚举Enum 枚举 Enum是在众多语言中都有的一种数据类型,JavaScript中还没有(TypeScript有).用来表示一些特定类别的常量数据,如性别.学历.方向.账户状态等,项目开发中是 ...

  2. Request保存作用域

    Request保存作用域,作用范围是在当前请求中有效. 1.客户端重定向 2.服务器内部转发

  3. 5.ElasticSearch系列之文档的基本操作

    1. 文档写入 # create document. 自动生成 _id POST users/_doc { "user" : "shenjian", " ...

  4. 2.RabbitMQ系列之生产者

    1. 新建队列 2. 新增POM.xml配置文件 <parent> <groupId>org.springframework.boot</groupId> < ...

  5. 如何规范App广告的隐私获取,让用户拥有更多知情权?

    随着互联网的不断普及,越来越多老百姓使用智能设备触达互联网.但用户经常发现自己无意间提到的东西,打开App就收到相关产品的广告推送,甚至有人怀疑手机App是通过麦克风来窃取自己平时聊天信息中的关键词进 ...

  6. 什么是subsignature和return-type-substitutable

    subsignature 什么是签名(signature) 方法签名组成:方法名+参数列表(参数的类型.个数.顺序) Java语言层面规定的签名是不包含返回值类型的: JVM层面规定的签名是包含返回值 ...

  7. Golang-Gin Response 统一返回restful格式的数据

    目的: gin返回restful格式的数据,返回的200,201 的数据 也包括异常时的404/500等情况 直接调用即可 package response import ( "github ...

  8. 万万没想到,除了香农计划,Python3.11竟还有这么多性能提升!

    众所周知,Python 3.11 版本带来了较大的性能提升,但是,它具体在哪些方面上得到了优化呢?除了著名的"香农计划"外,它还包含哪些与性能相关的优化呢?本文将带你一探究竟! 作 ...

  9. Go语言核心36讲27

    在前面的文章中,我们一起学习了Go程序测试的基础知识和基本测试手法.这主要包括了Go程序测试的基本规则和主要流程.testing.T类型和testing.B类型的常用方法.go test命令的基本使用 ...

  10. 【Java并发002】使用级别:线程同步与线程通信

    一.前言 本文介绍Java多线程技术,分为五个部分:多线程的两种实现方式--继承Thread类和实现Runnable接口:线程同步应用:三人吃苹果:线程同步+线程通信应用之一:生产者-消费者问题:线程 ...