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。(隔离性)
本文作者:莲藕淹,转载请注明原文链接:https://www.cnblogs.com/meanshift/p/15688152.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY