Hadoop详解(10) - Hadoop HA高可用
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集群
- 在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高可用的更多相关文章
- Hadoop 2、配置HDFS HA (高可用)
前提条件 先搭建 http://www.cnblogs.com/raphael5200/p/5152004.html 的环境,然后在其基础上进行修改 一.安装Zookeeper 由于环境有限,所以在仅 ...
- redis详解(四)-- 高可用分布式集群
一,高可用 高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响. 停止服务的原因可能由于网卡.路由器.机房.CPU负载过高.内存溢出.自然灾害等不可预期的原 ...
- 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 ...
- 大数据Hadoop的HA高可用架构集群部署
1 概述 在Hadoop 2.0.0之前,一个Hadoop集群只有一个NameNode,那么NameNode就会存在单点故障的问题,幸运的是Hadoop 2.0.0之后解决了这个问题,即支持N ...
- Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)
声明:作者原创,转载注明出处. 作者:帅气陈吃苹果 一.服务器环境 主机名 IP 用户名 密码 安装目录 master188 192.168.29.188 hadoop hadoop /home/ha ...
- hadoop 集群HA高可用搭建以及问题解决方案
hadoop 集群HA高可用搭建 目录大纲 1. hadoop HA原理 2. hadoop HA特点 3. Zookeeper 配置 4. 安装Hadoop集群 5. Hadoop HA配置 搭建环 ...
- 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. ...
- 大数据技术之HA 高可用
HDFS HA高可用 1.1 HA概述 1)所谓HA(High Available),即高可用(7*24小时不中断服务). 2)实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件的HA ...
- 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 ...
- Flink 集群搭建,Standalone,集群部署,HA高可用部署
基础环境 准备3台虚拟机 配置无密码登录 配置方法:https://ipooli.com/2020/04/linux_host/ 并且做好主机映射. 下载Flink https://www.apach ...
随机推荐
- 你应该知道的数仓安全:都是同名Schema惹的祸
摘要:我是管理员账号,怎么还没有权限?当小伙伴询问的时候,我第一时间就会想到都是用户同名Schema惹的祸 本文分享自华为云社区<你应该知道的数仓安全--都是同名Schema惹的祸>,作者 ...
- <五>掌握左值引用和初识右值引用
1:C++的引用,引用和指针的区别? 1:从汇编指令角度上看,引用和指针没有区别,引用也是通过地址指针的方式访问指向的内存 int &b=a ; 是需要将a的内存地址取出并存下来, b=20; ...
- DQL-聚合函数
DQL-聚合函数 SQL基本函数,聚合函数对一组值执行计算,并返回单个值,也被称为组函数. 聚合函数对一组值执行计算并返回单一的值.除 COUNT 以外,聚合函数忽略空值,如果COUNT函数的应用对象 ...
- debian如何删除无效的应用图标
1.看/usr/share/applications下是否有xxx.desktop 2.可以到-/.local/share/applications下看是否有xxx.desktop 来源:https: ...
- C++实现真值表
这一片文章主要是关于真值表,在完成之前我也遇到了许多问题.比如怎么去求解表达式的值,怎么去将每个变量进行赋值,也就是如何 将n个字符进行01全排列. 01全排列真的神奇,01全排列其实就是2^n.他可 ...
- selenium被某些网页检测不允许正常访问、登录等,解决办法
网站通过什么方式检测 function b() { return "$cdc_asdjflasutopfhvcZLmcfl_"in u || d.webdriver } 通过上方的 ...
- 【DL论文精读笔记】ResNet
Abstract 利用残差学习架构释放深度 152层深度是VGG的8倍,且复杂度更低 ImageNet上的错误率3.57% 在ILSVRC和2015COCO竞赛,在多项任务拿到第一 3.1 Intro ...
- <一>关于运算符重载
C++的运算符重载:使对象的运算表现得和编译器内置类型一样 如下代码,如果T是整形,那很好理解,但是如果 T 是一个 Student 类, a + b ?怎么操作,两个学生类怎么相加? 这个就是我们要 ...
- i春秋Fuzz
点开只有三个单词plz fuzz parameter 大概意思就是让我们疯狂尝试参数... 我们通过url尝试传入参数 ?user=123 ?name=123 ?username=123 ?id=12 ...
- ArrayList中的ConcurrentModificationException,并发修改异常,fail-fast机制。
一:什么时候出现? 当我们用迭代器循环list的时候,在其中用list的方法新增/删除元素,就会出现这个错误. package com.sinitek.aml; import java.util.Ar ...