ResourceManager HA 原理

  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 纳管的各项子服务关闭

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端工程化 搭建私有组件库 组件从开发到发布私有npm仓库的全过程

前言 基于Vue3.0 TS的组件从开发组件库到发布私有npm仓库的全过程 环境 这里列出本文所使用的环境版本 vue 3.0 vue/cli 4.5.9 nodeJs 14.15.1 npm 6.14.8 vue --version vue/cli 4.5.9 npm -v 6.14.8 node -v v14.15.1 步骤 创建项目 使用 vue-cli 创建一个 vue3 项目&a…

mysql的高级查询语句

1.本文前言 数据库是用来存储数据&#xff0c;更新&#xff0c;查询数据的工具&#xff0c;而查询数据是一个数据库最为核心的功能&#xff0c;数据库是用来承载信息&#xff0c;而信息是用来分析和查看的。所以掌握更为精细化的查询方式是很有必要的。本文将围绕数据的高级查…

C++类和对象(中)

目录 1.类的6个默认成员函数 2.构造函数 2.1构造函数的概念 2.2构造函数的重载 2.3默认构造函数 2.4总结 3.析构函数 3.1析构函数的概念 3.2编译器自动生成的析构函数会做那些事情呢&#xff1f; 3.3析构函数的析构顺序 4.拷贝构造函数&#xff08;复制构造函数&am…

用ChatGPT三分钟免费做出数字人视频- 提升自媒体魅力

用ChatGPT三分钟免费做出数字人视频- 提升自媒体魅力 一、ChatGPT产生文案二、腾讯智影网站三、选择一个2D数字人四、粘贴文本五、编辑自定义&#xff0c;合成六、资源七、其他数字人平台推荐八、生成视频预览 本教程收集于&#xff1a;AIGC从入门到精通教程汇总 操作指引 Ch…

哪个牌子的电视盒子好用?罗鹏数码盘点2023电视盒子排名

电视机资源少、卡顿&#xff0c;配置不足的时候只需要安装一台电视盒子就可以解决这些问题&#xff0c;不需要花费大价钱更换电视机。那么&#xff0c;你知道哪个牌子的电视盒子好用吗&#xff1f;今天罗鹏就来详细聊聊这个话题&#xff0c;分享2023最新电视盒子排名。 一&…

gitlab服务器发送邮件配置

1.修改gitlab的配置文件&#xff1a; vim /etc/gitlab/gitlab.rb 这里具体的gitlab.rb文件所在路径需要根据实际的来 找到如下图所示的部分&#xff0c;放开注释&#xff0c;修改配置&#xff0c;此处我用的发件邮箱是QQ邮箱&#xff0c;所以域名配置都是qq.com&#xff0c;…

图表控件Stimulsoft 2023.2 带来极致深色主题, 一起来看看还有哪些亮点?

Stimulsoft Reports 是一款报告编写器&#xff0c;主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署&#xff0c;如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等&#xff0c;在你的应用程序中嵌入报告设计器…

clickhouse的嵌套数据结构Tuple、Array与Nested类型介绍和使用示例

文章目录 Tuple类型Array类型Nested类型使用示例单独使用Tuple数组嵌套 Array(Tuple)Nested类型 生产使用&#xff1a;分组查询 Tuple类型 Tuple是ClickHouse数据库中的一种数据类型&#xff0c;它允许在一个字段中存储由不同数据类型组成的元组(tuple)。元组可以包含任意数量…

快速了解C语言的基本元素

C语言是一种编程语言&#xff0c;和其它语言一样&#xff0c;也定义了自己的语法和词汇。学习C语言&#xff0c;首先要学习C语言的词汇&#xff0c;再学习C语言的语法规则&#xff0c;然后由词汇构成语句&#xff0c;由语句构成源程序&#xff0c;源程序也称为源代码或代码&…

ChatGPT :国内免费可用 ChatGPT +Midjourney绘图

前言 ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;美国OpenAI 研发的聊天机器人程序 &#xff0c;于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过理解和学习人类的语言来…

【MySQL】绪论 MySQL工作环境

文章目录 实验内容实验步骤实验内容 MySQL命令MySQL 的启动与关闭MySQL 管理备份和还原数据库navicat工具使用实验步骤 1. MySQL命令 (1)查看MySQL基本命令 (2)查看MySQL版本信息 2. MySQL的启动与关闭 (1)启动MySQL服务器 (2)测试服务器启动成功 (3)合法用

stream笔记

1、 创建流stream 1.1、 Stream 的操作三个步骤 1.2、 stream中间操作 1.2.1 、 limit、skip、distinct 1.2.2、 map and flatMap 1.2.3、 sort 自然排序和定制排序 1.3、 add and andAll difference: 1.4、 终止操作 1.4.1、 allmatch、anyMatch、noneMatch、max、min…

前端开发中,定位bug的几种常用方法

目录 第一章 前言 第二章 解决bug的方法 2.1 百度 2.2 有道翻译 2.3 debugger 2.4 console.log 日志打印 2.5 请求体是否携带参数 2.6 注释页面渲染代码 2.7 其他 第三章 尾声 备注&#xff1a;该文章只是本人在工作/学习中常用的几种方法&#xff0c;如果有不对大家…

朋友去华为面试,轻松拿到30K的Offer,羡慕了......

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

第四十六章 Unity 布局(上)

学习了UI元素的使用&#xff0c;并不能构建出一个完整的UI界面&#xff0c;我们需要使用一些方法将这些UI元素按照“设计稿”的效果&#xff0c;将其摆放到对应的位置上。如何摆放这些UI元素&#xff0c;就是我们需要讲的“布局”&#xff0c;当然这需要借助一些布局组件来完成…

毕业论文相关

毕业论文参考文献和Word保存 一、Word中出现[7-9]多个文献的引用 在正文中选中参考文献角标&#xff0c;右击选择“切换域代码”&#xff0c;参考文献角标[7][8][9]变为{ REF _Ref98345319 \r \h * MERGEFORMAT }{ REF _Ref98345321 \r \h * MERGEFORMAT }{ REF _Ref99390603…

第5章 负载均衡

第5章 负载均衡 5.1 proxy_pass详解 在nginx中配置proxy_pass代理转发时&#xff0c;如果在proxy_pass后面的url加/&#xff0c;表示绝对根路径&#xff1b;如果没有/&#xff0c;表示相对路径&#xff0c;把匹配的路径部分也给代理走。 假设下面四种情况分别用 http://192.…

Java并发编程实践学习笔记(三)——共享对象之发布和异常

目录 1 公共静态变量逸出 2 非私有方法逸出私有变量 3 this引用逸出 4 构造函数中的可覆盖方法调用逸出 发布&#xff08;publishing&#xff09;一个对象的意思是&#xff1a;使对象能够在当前作用域之外的代码中使用。例如&#xff0c;将一个指向该对象的引用保存到其他代…

InnoDB线程模型

新版本结构演变 MySQL 5.7 版本 将 Undo日志表空间从共享表空间 ibdata 文件中分离出来&#xff0c;可以在安装 MySQL 时由用户自行指定文件大小和数量增加了 temporary 临时表空间&#xff0c;里面存储着临时表或临时查询结果集的数据Buffer Pool 大小可以动态修改&#xff0…

你不知道的自动化?使用自动化测试在项目中创造高业务价值...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 脱离数据支撑谈价…