ResourceManager HA 原理

news2024/12/23 9:45:56

  1. 简介

为了解决 Yarn 中 ResourceManager 的单点故障问题,在 Hadoop 2.4 中新增了 ResourceManager HA 的能力, 该文章基于 Hadoop 3.1.1 进行讲解。

1.1. 名词定义

全称简称备注
ResourceManagerRm
ZookeeperZK

  1. ResourceManager Ha 架构

ResourceManager HA 是基于 Active/Standby 架构形态,在集群中任意时刻最多只能有一个 Active 状态的 Rm 一个或多个 Standby 状态的 Rm,当 Active RM 故障时会基于 Zookeeper Watcher 机制从 Standby 状态的 Rm 中选取出一个 Rm 进行接管实现自动的故障转移。

 

  1. ResourceManager 启用 HA

在 yarn-site.xml 新增以下配置并分发重启 Yan 集群即可重启 ResourceManager HA

配置名称默认值配置描述
hadoop.zk.address用于 ResourceManager 故障转移和 Yarn 集群元数据存储的 Zk 集群地址
yarn.resourcemanager.ha.enabledFALSE是否启用 Rm Ha
yarn.resourcemanager.ha.rm-ids集群中多个 ResourceManager 逻辑 Rm-Id 列表eg: rm1 、rm2
yarn.resourcemanager.address.rm-id指定 rm-id 对应 ClientRMService Rpc 服务地址 host:porteg: offline1:8032
yarn.resourcemanager.scheduler.address.rm-id指定 rm-id 对应 ApplicationMasterService Rpc 服务地址 host:porteg: offline1:8030
yarn.resourcemanager.resource-tracker.address.rm-id指定 rm-id 对应 ResourceTrackerService Rpc 服务地址 host:porteg: offline1:8031
yarn.resourcemanager.admin.address.rm-id指定 rm-id 对应 AdminService Rpc 服务地址 host:porteg: offline1:8033
yarn.resourcemanager.webapp.address.rm-id指定 rm-id 对应 Http 服务地址 host:porteg: offline1:8088
yarn.resourcemanager.webapp.https.address.rm-id指定 rm-id 对应 Https 服务地址 host:porteg: offline1:8090
yarn.resourcemanager.ha.idHa 对应的 Id
yarn.resourcemanager.ha.automatic-failover.enabledFALSE是否启用自动故障转移
yarn.resourcemanager.ha.automatic-failover.embeddedTRUE是否启用内置的自动故障转移(EmbeddedElector)
yarn.resourcemanager.cluster-idyarn_cluster集群名称
yarn.client.failover-proxy-provider开启 HA 时 Client 、NM 访问 RM 代理类默认值:org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider
yarn.client.failover-no-ha-proxy-provider关闭 HA 时 Client 、NM 访问 RM 代理类默认值:org.apache.hadoop.yarn.client.DefaultNoHARMFailoverProxyProvider
yarn.client.failover-max-attempts-1无限制Failover 失败最大尝试次数
yarn.client.failover-sleep-base-ms30s不配置则使用 yarn.resourcemanager.connect.retry-interval.ms的参数值
yarn.client.failover-sleep-max-ms30s不配置则使用 yarn.resourcemanager.connect.retry-interval.ms的参数值
yarn.client.failover-retries30尝试重试链接 RM 的次数rmConnectWaitMS / failoverSleepBaseMs
yarn.client.failover-retries-on-socket-timeouts45s链接超时时间
yarn.resourcemanager.zk-timeout-ms10000ms连接 Zk 超时时间
yarn.resourcemanager.zk-addressZK 集群地址
yarn.resourcemanager.ha.failover-controller.active-standby-elector.zk.retries3选择链接 Zk 重试次数如果不配置则使用:ha.failover-controller.active-standby-elector.zk.op.retries默认值为:3 次
  1. ResourceManager 故障转移的两种模式

4.1. 手动模式下的故障转移

  • 在没有开启自动故障转移时,使用 Yarn 用户执行命令进行主备切换

 

yarn.resourcemanager.ha.automatic-failover.enabled = false

  • 命令由 Yarn Client 向 ResoceManager 中的 AdminServer 发起执行对应的切主或切备操作

 

#获取所有 RM 的状态 yarn rmadmin -getAllServiceState #获取指定 RM 状态 yarn rmadmin -getServiceState rm2 #将指定 RM 切换为 Standby 状态 yarn rmadmin -transitionToStandby rm2 #将指定 RM 切换为 Active 状态 yarn rmadmin -transitionToActive --forceactive rm2

 

4.2. 自动模式下的故障转移

  • 当我们将 “yarn.resourcemanager.ha.automatic-failover.enabled” 设置为 true 时 Yarn 就会启用 ResourceManager 自动的故障转移

  • 在以下时机会触发自动选住行为

    • 当 ResourceManager 启动时选主

    • 当 Active ResourceManager 故障时触发选主

    • 当 Active ResourceManager 在操作 ZK 上的元数据失败时触发选主

 

4.2.1. ResourceManager 启动时选主

  • 开启 HA 的 ResourceManager 启动首先会调用 transitionToStandby 方法让当前 RM 进入 Standby 状态

  • 随后会启动 ResourceManager 纳管的各项服务,其中包含 ActiveStandbyElectorBasedElectorService

  • ActiveStandbyElectorBasedElectorService 会调用内部的选主服务(ActiveStandbyElector)参与选主,会尝试在选主目录下创建 ActiveStandbyElectorLock 临时节点

 

private void createLockNodeAsync() { zkClient.create(zkLockFilePath, appData, zkAcl, CreateMode.EPHEMERAL, this, zkClient); }

  • 并注册对应的监听器(ActiveStandbyElector)监听创建的结果

    • 响应结果是临时节点创建成功则会调用 becomeActive() 方法将当前 ResourceManager 转换为 Active RM 对外提供服务

    • 响应结果是是临时节点已经存在,则调用 becomeStandby( ) 将当前 RM 转换为 Standby RM

    • 最后都会调用 monitorActiveStatus() 方法对选主的临时节点状态(exists)进行监控

    • 其它响应结果则尝试重试选主

 

/** * 处理 Client 执行 create 函数结果的回调函数 */ public synchronized void processResult(...) { ... if (isSuccess(code)) { if (becomeActive()) { //对节点进行监听 monitorActiveStatus(); } else { //如果 becomeActive 失败,等待 1s 后再尝试选举 reJoinElectionAfterFailureToBecomeActive(); } return; } if (isNodeExists(code)) { //如果选举的临时节点已经存在 if (createRetryCount == 0) { becomeStandby(); //如果尝试次数为 0 则转换为 Standby } ... monitorActiveStatus(); //再次 watch Zonde return; } .... if (shouldRetry(code)) { if (createRetryCount < maxRetryNum) { LOG.debug("Retrying createNode createRetryCount: " + createRetryCount); ++createRetryCount; //次数+1 createLockNodeAsync(); //创建 Znode 进行选主 return; } .... }

 

4.2.2. Active ResourceManager “故障” 时触发的选主

故障覆盖范围

由于节点故障导致该节点上的 ResourceManager 进程挂掉的情况 由于 ResourceManager 内部异常导致进程挂掉的情况 由于节点网络异常导致 ResourceManager 与 Zk 断链的情况 由于 ResourceManager 内部异常导致 ResourceManager 与 Zk 断链的情况

  • 由上可知在 ResourceManager 启动后 Active、Standby ResourceManager 都会再监听选主临时节点的变化

  • 当 Active ResourceManager 发生 “故障” 时机会再次触发选主

    • 当 RM 的 Watcher 感知到选主的 Znode 变化之后接收到回调,出来回调的结果来决定是否参与选主

    • 如果选主的 Znode 还存在,则对比 Znode 当前的 onwer 是否与当前 RM 持有的 Zk session 是否一致

      • 如果一致则调用 becomeActive 尝试将当前 RM 转换为 active

      • 否则调用 becomeStandby 切换到 Standby

    • 如果 Znode 不存在了,则让当前 RM 先进入 NEUTRAL 状态,再执行 becomeStandby 切换到 Standby ,最后再调用 joinElectionInternal 方法去创建 Znode 参与选主

 

4.2.3. Active ResourceManager 操作 ZK 元数据失败触发的选主

4.2.3.1. RMStateStore 介绍

  • 主要作用为 Yarn 的元数据存储服务,主要为作业的提交信息、运行时信息

  • RMStateStore 的实现方式有:FileSystem、Memory、LevelDB、ZK

  • ResourceManager 使用的 RMStateStroe 由 "yarn.resourcemanager.store.class“ 指定

  • RMStateStore 在操作元数据失败时,会触发 STATE_STORE_FENCED 事件最后由 RMFatalEventDispatcher 调用 handleTransitionToStandByInNewThread 将当前 ResourceManager 状态转为 Standby

4.2.4. ZKRMStateStore 的 Fencing 机制

  • Fencing 机制主要是解决 ZKRMStateStore 在操作元数据发生脑裂问题,写入错误的数据

在实际生产情况,可能会出现 RM 在垃圾回收、机器负载过高等情况,会在长时间内整个系统无响应, 因此,也就无法向 zk 写入心跳信息,这样的话会导致选择的临时节点掉线备 RM 会切换到 Active 状态, 但是当前节点仍然会认为自己是 Active 节点,由此会导致整个集群会有同时有两个 Active RM

  • Yarn 为了解决该问题 RM 修改元数据时会,在 ZK 中元数据修改前创建一个持久化节点( RM_ZK_FENCING_LOCK) 并设置 ACL 独占对 Yarn 元数据的修改,在元数据修改之后删除该节点释放独占,并将这个三个操作绑定在一个事务中合并执行保证执行结果的一致性

RM_ZK_FENCING_LOCK 就是一个分布式锁,拿到锁的人才允许操作元数据

4.2.4.1. 操作元数据失败触发的选主

  • 如下图 Active Rm 在调用 ZKRMStateStore 操作 Zk 上 Yarn 的元数据 (添加 App、删除 APP)过程中如果,操作失败或者发生异常则会触发 RMFatalEventType 事件

  • 最后 RMFatalEventDispatcher 接收处理,并创建一个 StandByTransitionRunnable 线程调用 transitionToStandby 方法将当前 Active RM 转换为 Standby RM,并触发 ResourceManager HA 自动故障转移

 

ResourceManager HA 自动模式下故障紧急操作命令

  • 如 HA 自动模式下异常脑裂时可使用 “forcemanual” 进行强制手动切换 Active 与 Standby

 

yarn rmadmin -transitionToActive --forcemanual rm2 /** Automatic failover is enabled for org.apache.hadoop.yarn.client.RMHAServiceTarget@12d3a4e9 Refusing to manually manage HA state, since it may cause a split-brain scenario or other incorrect state. If you are very sure you know what you are doing, please specify the --forcemanual flag. */

4.2.5. becomeActive/becomeStandby 主备切换方法详解

在 RM 选主时得到最终结果时调用 ActiveStandbyElector 的 becomeActive 方法将当前 Rm 切换为 active 节点 调用 becomeStandby 方法将当前节点切换为 Standby 节点

4.2.5.1. ResourceManager HA 服务纳管

ResourceManger 在开启 HA 时 Standby RM 能正常选主和避免 Standby 状态时部分服务一直运行会导致异常运行,将服务拆分为两大类管理:

  • 主备切换时不需要重启的服务,会在 ResourceManager 进程中一直运行提供服务

    • Dispatcher :核心事件转发器

    • ActiveStandbyElectorBasedElectorService : 选主器

    • AdminService :RM 管理服务

  • 主切换时需要重启的服务,交给 RMActiveServices 管理,在 Standby 状态事将管理的服务全部停止,在 Active 状态时会创建 RMActiveServices 以及下面管理的各项子服务对外提供服务

    • RMStateStore

    • nodesListManager

    • ClientRMService

    • ApplicationMasterService

    • ResourceScheduler

 

  4.2.5.2. becomeActive 过程详解

  • 当 Rm 选主器 Watcher 到 Zk 上选主的临时节点被删除时就会触发选主,当该 Rm 的选主器在 Zk 上创建选主节点成功后,就会调用 becomeActive 方法将当前 RM 转换为 Active Rm

  • 选主器(ActiveStandbyElector) 的 becomeActive 方法首先会 AdminService 内部服务的 transitionToActive 方法将所有内部服务拉起能够对外提供服务

  • 其次会更新选主器状态为 ACTIVE 标记当前 Rm 为 Active Rm

 

private boolean becomeActive() { ... try { ... LOG.debug("Becoming active for {}", this); //初始化 Active Rm 内部服务 appClient.becomeActive(); //更新当前 RM 的状态 state = State.ACTIVE; return true; } catch (Exception e) { LOG.warn("Exception handling the winning of election", e); return false; } }

  • transitionToActive 过程中

    • 首先会调用 refreshAll 重新加载最新的配置

 

//队列调度配置 refreshQueues(); //刷新 include、exclude 节点信息 refreshNodes(); //刷新超级用户信息 refreshSuperUserGroupsConfiguration(); //刷新用户组映射信息 refreshUserToGroupsMappings(); //刷新各服务 acl 信息 if (getConfig().getBoolean( CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHORIZATION, false)) { refreshServiceAcls(); }

  • 其次将其 RMActiveServices 纳管的各项子服务全部启动

  • 最后更新 RM 上下文(RMContext)的 HA 状态

    • 该状态用于内部 RM HA 的状态判断和外部调用 AdminService Rpc 服务时核心方法是否能允许执行的判断

4.2.5.3. becomeStandby 过程详解

  • 当 Active Rm 故障与 Zk 断连最终导致持有的 Zk 上的选主节点被删除掉时,当该 Rm 的选主器也会感知到该事件,同时再次会参与选主,再次选主失败后 ,就会调用 becomeStandby 方法将当前 RM 转换为 Standby Rm

  • 选主器(ActiveStandbyElector) 的 becomeStandby 方法首先会将选主器的状态转为 STANDBY

 

private void becomeStandby() { if (state != State.STANDBY) { //先更新状态为 STANDBY,不对外提供服务 state = State.STANDBY; appClient.becomeStandby(); } }

  • 其次调用 AdminService 的 transitionToStandby 方法

    • 首先会将 RM 上下文(RMContext)的 HA 状态更新为 Standby

    • 其次将 RMActiveServices 纳管的各项子服务关闭

    • 最后清空内部统计指标、重置各基础服务信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/508792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux shell编程 数组 ^ 数组排序

数组定义 数组内数据类型可以为数值也可以为字符串。 若字符串类型需要使用 " " 包含以免空格扰乱数组。 方法1 空格分隔直接定义数组 arr(10 20 30 40 50) arr1(zhangsan lisi wangwu) 方法2 指定元素下标定义&#xff0c;若跳过元素不设置会显示为空 arr([0]1…

Python 密码破解指南:10~14

协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【OpenDocCN 饱和式翻译计划】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 收割 SB 的人会被 SB 们封神&#xff0c;试图唤醒 SB 的人是 SB 眼中的 SB。——SB 第三定律 十、加…

震惊!如果患上植物神经紊乱,就会诱发胃肠神经功能紊乱!

植物神经系统和胃肠系统是人体内重要的调节系统&#xff0c;它们分别负责着许多生物过程的调控。当这两个系统出现紊乱时&#xff0c;会对人体健康产生不良影响。本文将从植物神经紊乱与胃肠神经功能紊乱的关系、症状、治疗办法和生活预防方法四个方面进行探讨。 一、植物神经紊…

GoAccess 网站日志分析

GoAccess是一个开源且免费的网站日志分析和交互式WEB日志查看器&#xff0c;可在 Linux 系统的终端中或通过浏览器运行。使用它可让系统管理员视化的查看统计报告&#xff0c;这对于SEO以及运维来说非常有价值。 GoAccess支持几乎所有Web 日志格式&#xff0c;包含&#xff1a;…

数据结构-图的遍历和应用(DAG、AOV、AOE网)

目录 *一、广度优先遍历(BFS) 广度优先生成树 广度优先生成森林 *二、深度优先遍历 深度优先生成树 深度优先生成森林 二、应用 2.1最小生成树 *Prim算法 *Kruskal算法 2.2最短路径 *BFS算法 *Dijkstra算法 *Floyd算法 *2.3有向无环图(DAG网) *2.4拓扑排序(AOV网)…

Java之线程安全

目录 一.上节回顾 1.Thread类常见的属性 2.Thread类中的方法 二.多线程带来的风险 1.观察线程不安全的现象 三.造成线程不安全现象的原因 1.多个线程修改了同一个共享变量 2.线程是抢占式执行的 3.原子性 4.内存可见性 5.有序性 四.解决线程不安全问题 ---synchroni…

【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制

这一篇文章分享本人学习win32绘图编程&#xff0c;其中包括GDI绘图对象&#xff0c;绘图基础&#xff0c;基本图形的绘制&#xff0c;画笔画刷的使用&#xff0c;文本绘制&#xff0c;以及文本字体的更改。 文章目录 一.绘图基础1.BeginPaint函数2.EndPaint函数3.颜色的使用 二…

8 集群管理

8 集群管理 8.1 集群结构 ES通常以集群方式工作&#xff0c;这样做不仅能够提高 ES的搜索能力还可以处理大数据搜索的能力&#xff0c;同时也增加了系统的容错能力及高可用&#xff0c;ES可以实现PB级数据的搜索。 下图是ES集群结构的示意图&#xff1a; 从上图总结以下概念…

SSM整合详细教学(下)

SSM整合详细教学&#xff08;下&#xff09; 五、SSM整合页面开发1 准备工作2 列表查询功能3 添加功能4 修改功能5 删除功能 六、拦截器1 拦截器简介问题导入1.1 拦截器概念和作用1.2 拦截器和过滤器的区别 2 入门案例问题导入2.1 拦截器代码实现【第一步】定义拦截器【第二步】…

从零开始搭建高效的文件服务器:FastDFS与Nginx完美结合,内网穿透实现公网访问

目录 前言 1. 本地搭建FastDFS文件系统 1.1 环境安装 1.2 安装libfastcommon 1.3 安装FastDFS 1.4 配置Tracker 1.5 配置Storage 1.6 测试上传下载 1.7 与Nginx整合 1.8 安装Nginx 1.9 配置Nginx 2. 局域网测试访问FastDFS 3. 安装cpolar内网穿透 4. 配置公网访问…

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归时间序列区间预测

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 进阶版 基础版 基本介绍 MATLAB实现QRBiLS…

C语言介绍

C语言的简洁 C语言仅有32个关键字、9种控制语句、34种运算符即可实现无数的功能。 关键字 可省略的关键字&#xff1a;auto、extern、signed. 复合类型的关键字&#xff1a;enum、struct、union. include include表示导入&#xff0c;include可以导入任意的文件。 比如#in…

Windows消息,消息循环的处理,消息队列,键盘消息,鼠标消息,定时器消息

上一章节中我们带大家编写了第一个Windows程序&#xff0c;并且带大家学习了注册窗口&#xff0c;创建窗口&#xff0c;这一章中我们来学习Windows消息&#xff0c;学习对消息循环处理的原理&#xff0c;并且带领大家学习一些常见的消息。 文章目录 一.消息基础1.消息概念及其作…

AOF 持久化详解

文章目录 AOF 相关配置AOF 文件的修复AOF 文件格式RESP 协议查看 AOF 文件清单文件 AOF RewriteRewrite 策略手动Rewrite自动Rewrite AOF 持久化过程AOF优缺点AOF与RDB混合持久化 AOF (Append Only File) 是把所有对内存进行修改的指令&#xff08;写操作&#xff09;以独立日志…

《花雕学AI》用AI创造清晨的美好:ChatGPT+DALL-E 2 生成“早上好”的场景图

早晨是一天中最美好的时刻&#xff0c;也是最适合与AI对话的时刻。想象一下&#xff0c;当你醒来&#xff0c;打开手机&#xff0c;就能看到一个AI为你生成的“早上好”的场景图&#xff0c;是不是很温馨&#xff1f;这就是ChatGPTDALL-E 2&#xff08;新Bing&#xff09; 的魅…

Elevate:全世界最小的介入泵,融资五千万美金

近日&#xff0c;以色列医疗器械公司Magenta Medical宣布完成5500万美元的C轮融资&#xff0c;该公司主要产品Elevate是目前全球最小的心脏介入泵&#xff0c;主要用于治疗急性心力衰竭患者和高危PCI的辅助。该泵采用了创新的设计和材料&#xff0c;可以通过桡动脉插入&#xf…

哪款远程控制软件可以远程玩游戏?

远程控制软件可以让你在不同设备之间进行远程控制。许多人可能会想知道&#xff0c;哪款远程控制软件可以在远程玩游戏时享受更好的游戏体验。 首先&#xff0c;在寻找适合远程游戏的远程控制软件之前&#xff0c;我们需要知道什么是远程游戏和远程控制。 远程游戏是一种允许玩…

第十二章_Redis单线程 VS 多线程

Redis为什么选择单线程&#xff1f; 是什么 这种问法其实并不严谨&#xff0c;为啥这么说呢? Redis的版本很多3.x、4.x、6.x&#xff0c;版本不同架构也是不同的&#xff0c;不限定版本问是否单线程也不太严谨。 1 版本3.x &#xff0c;最早版本&#xff0c;也就是大家口口相…

一文读懂 DNS 解析

导读 文章为“一文读懂域名与网站系列”第二篇&#xff0c;上篇文章主要介绍了域名的注册、建站和管理&#xff0c;通过本文你可以了解以下几个问题&#xff1a; 域名的结构、常用解析记录的类型 DNS 解析的过程 DNS 解析拓展知识 众所周知&#xff0c;互联网中的地址其实是…

想让行车记录仪协助道路病害自动化检测?可以!

针对【RGB3DS道路表观病害信息智慧检测系统】&#xff0c;我们着重介绍过其与道路检测车做集成预装或者处理道路检测车数据的极大便利&#xff0c;其中之一便是可高效输出带有道路检测车桩号标记的病害报表&#xff0c;这是因为道路检测车数据本身具有规范性。 那么如果使用道…