Hadoop-Yarn-ResourceManagerHA

在这里先给屏幕面前的你送上祝福,祝你在未来一年:技术步步高升、薪资节节攀升,身体健健康康,家庭和和美美。

一、介绍

在Hadoop2.4之前,ResourceManager是YARN集群中的单点故障

ResourceManager HA是通过 Active/Standby 体系结构实现的,在任何时候其中一个RM都是活动的,并且一个或多个RM处于备用模式,等待在活动发生任何事情时接管。

二、架构

官网的架构图如下:

1、Active 状态的 ResourceManager 将自己的状态写入ZooKeeper

2、如果 Active 状态的 ResourceManager状态发生改变,可以通过自动或手动方式完成故障转移

三、故障转移

1、手动转换

        如果未启用自动故障切换,管理员必须手动将其中一个ResourceManager转换为活动。要从一个ResourceManager故障切换到另一个ResourceManager,他们应该首先将活动ResourceManager转换为备用ResourceManager,然后将备用ResourceManager转换为活动ResourceManager。相关命令如下:

        获取所有RM节点的状态
                yarn rmadmin -getAllServiceState
        获取 rm1 节点的状态
                yarn rmadmin -getServiceState rm1
        手动将 rm1 的状态切换到STANDBY
                yarn rmadmin -transitionToStandby rm1
                或
                yarn rmadmin -transitionToStandby -forcemanual rm1
        手动将 rm1 的状态切换到ACTIVE
                yarn rmadmin -transitionToActive rm1
                或 
                yarn rmadmin -transitionToActive -forcemanual rm1

2、自动切换

        ResourceManager可以选择嵌入基于Zookeeper的ActiveStandbyElector来决定哪个ResourceManager应该是Active。当Active宕机或无响应时,会自动选择另一个ResourceManager作为Active,然后由它接管。需要注意的是Yarn不需要像HDFS那样运行单独的ZKFC守护进程,因为嵌入在ResourceManager中的ActiveStandbyElector充当故障检测器和领导者选举人。

        配置示例如下:

<property><name>yarn.resourcemanager.ha.enabled</name><value>true</value><description>开启resourcemanager的HA</description>
</property>
<property><name>yarn.resourcemanager.cluster-id</name><value>cluster1</value><description>标识群集。由选举人使用,以确保RM不会作为“活动”接管另一个群集。</description>
</property>
<property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value><description>RM的逻辑ID列表</description>
</property>
<property><name>yarn.resourcemanager.hostname.rm1</name><value>master1</value><description>对于每个rm-ids,指定rm对应的主机名。或者,可以设置rm的每个服务地址</description>
</property>
<property><name>yarn.resourcemanager.hostname.rm2</name><value>master2</value><description>对于每个rm-ids,指定rm对应的主机名。或者,可以设置rm的每个服务地址</description>
</property>
<property><name>yarn.resourcemanager.webapp.address.rm1</name><value>master1:8088</value><description>对于每个rm-ids,指定与之对应的rm web应用程序的host:port</description>
</property>
<property><name>yarn.resourcemanager.webapp.address.rm2</name><value>master2:8088</value><description>对于每个rm-ids,指定与之对应的rm web应用程序的host:port</description>
</property>
<property><name>hadoop.zk.address</name><value>zk1:2181,zk2:2181,zk3:2181</value><description>ZK法定人数的地址。用于两者状态和领导人选举</description>
</property>

四、源码分析

在我的上一篇<Hadoop-Yarn-启动篇>博客中有ResourceManager的启动源码,现在我们只将关于HA的部分拿处理分析下

1、设置HA配置

    //登录前应设置HA配置this.rmContext.setHAEnabled(HAUtil.isHAEnabled(this.conf));if (this.rmContext.isHAEnabled()) {HAUtil.verifyAndSetConfiguration(this.conf);}public static boolean isHAEnabled(Configuration conf) {//即获取yarn.resourcemanager.ha.enabled的值return conf.getBoolean(YarnConfiguration.RM_HA_ENABLED,YarnConfiguration.DEFAULT_RM_HA_ENABLED);}public static void verifyAndSetConfiguration(Configuration conf)throws YarnRuntimeException {//验证配置是否至少有两个RM id,并且为每个RM-id指定了RPC地址。然后设置RM id。//即 配置文件中的 yarn.resourcemanager.ha.rm-ids 对应配置的多个 RM 节点的RPC地址verifyAndSetRMHAIdsList(conf);//设置 yarn.resourcemanager.ha.id 的值,如果没有配置则通过匹配yarn.reresourcemanager.address来计算verifyAndSetCurrentRMHAId(conf);//验证 Leader 选举服务是否已启用。YARN允许在配置中禁用领导层选举,从而中断自动故障切换verifyLeaderElection(conf);//验证所有服务的地址//    RM_ADDRESS 即 yarn.resourcemanager.address//    RM_SCHEDULER_ADDRESS 即 yarn.resourcemanager.scheduler.address//    RM_ADMIN_ADDRESS 即 yarn.resourcemanager.admin.address//    RM_RESOURCE_TRACKER_ADDRESS 即 yarn.resourcemanager.resource-tracker.address//    RM_WEBAPP_ADDRESS 即 yarn.resourcemanager.webapp.addressverifyAndSetAllServiceAddresses(conf);}

2、添加选举人

//必须在管理员服务后添加选举人
if (this.rmContext.isHAEnabled()) {//获取配置文件中yarn.resourcemanager.ha.automatic-failover.enabled的值,默认true//    启用自动故障切换;默认情况下,只有在启用HA时才会启用它。//获取配置文件中yarn.resourcemanager.ha.automatic-failover.embedded的值,默认true//    启用嵌入式自动故障切换。默认情况下,只有在启用HA时才会启用它。//    嵌入式elector依赖于RM状态存储来处理围栏,主要用于与ZKRMStateStore结合使用。if (HAUtil.isAutomaticFailoverEnabled(conf)&& HAUtil.isAutomaticFailoverEmbedded(conf)) {EmbeddedElector elector = createEmbeddedElector();//添加Curator的领导人选举服务addIfService(elector);rmContext.setLeaderElectorService(elector);}
}protected EmbeddedElector createEmbeddedElector() throws IOException {EmbeddedElector elector;//获取配置文件中 yarn.resourcemanager.ha.curator-leader-elector.enabled 的值,默认true/是否使用Curator-based的选举人进行领导人选举curatorEnabled =conf.getBoolean(YarnConfiguration.CURATOR_LEADER_ELECTOR,YarnConfiguration.DEFAULT_CURATOR_LEADER_ELECTOR_ENABLED);if (curatorEnabled) {//获取ZooKeeper Curator管理器,创建并启动(如果不存在)this.zkManager = createAndStartZKManager(conf);/使用Curator的领导人选举实施elector = new CuratorBasedElectorService(this);} else {elector = new ActiveStandbyElectorBasedElectorService(this);}return elector;
}

3、创建并启动ZooKeeper Curator管理器

Curator是Netflix公司在原生zookeeper客户端基础上开源的第三方Java客户端,使用它可以去操作zookeeper创建、删除、查询、修改znode节点

  public ZKCuratorManager createAndStartZKManager(Configurationconfig) throws IOException {//提供特定于ZK操作的实用程序方法的Helper类ZKCuratorManager manager = new ZKCuratorManager(config);//获取身份验证List<AuthInfo> authInfos = new ArrayList<>();//获取 yarn.resourcemanager.ha.enabled 值,默认false//获取 yarn.resourcemanager.zk-state-store.root-node.acl + yarn.resourcemanager.ha.id 的值//yarn.resourcemanager.ha.id官方解释:(在第1步已经设置过这个值了)//当前RM的id(字符串)。启用HA时,这是一个可选配置。当前RM的id可以通过显式指定yarn.resourcemanager.ha.id来设置,也可以通过匹配yarn.reresourcemanager.address来计算。具有本地地址的{id}请参阅yarn.resourcemanager.ha.enabled的描述,了解如何使用它的完整详细信息。//yarn.resourcemanager.zk-state-store.root-node.acl官方解释://在HA场景中使用ZKRMStateStore进行围栏时,用于根znode的ACL。ZKRMStateStore支持隐式围栏,允许单个ResourceManager对存储进行写访问。对于围栏,群集中的ResourceManager在根节点上共享读写管理权限,但Active ResourceManager声明具有独占的创建-删除权限。默认情况下,当未设置此属性时,我们使用来自yarn.resourcemanager.zk-cl的acl进行共享管理访问,并使用rm address:random number进行基于用户名的独占创建-删除访问。此属性允许用户设置自己选择的ACL,而不是使用默认机制。为了使围栏发挥作用,应在每个ResourceManager上小心地以不同的方式设置ACL,以便所有ResourceManager都具有共享的管理访问权限,而Active ResourceManager(仅)接管创建-删除访问权限。if (HAUtil.isHAEnabled(config) && HAUtil.getConfValueForRMInstance(YarnConfiguration.ZK_RM_STATE_STORE_ROOT_NODE_ACL, config) == null) {String zkRootNodeUsername = HAUtil.getConfValueForRMInstance(YarnConfiguration.RM_ADDRESS,YarnConfiguration.DEFAULT_RM_ADDRESS, config);// private final String zkRootNodePassword =Long.toString(new SecureRandom().nextLong());//由此可见 zkRootNodePassword 是一个随机数String defaultFencingAuth =zkRootNodeUsername + ":" + zkRootNodePassword;//RM地址和一个随机数构建了一个字节数组byte[] defaultFencingAuthData =defaultFencingAuth.getBytes(Charset.forName("UTF-8"));//构建身份验证摘要String scheme = new DigestAuthenticationProvider().getScheme();AuthInfo authInfo = new AuthInfo(scheme, defaultFencingAuthData);authInfos.add(authInfo);}//开始连接到ZooKeeper集合manager.start(authInfos);return manager;}

4、连接ZooKeeper集合

public void start(List<AuthInfo> authInfos) throws IOException {//获取ZooKeeper团队地址 即 hadoop.zk.address//	    <property>//		  <name>hadoop.zk.address</name>//		  <value>zk1:2181,zk2:2181,zk3:2181</value>//		  <description>ZK法定人数的地址。用于两者状态和领导人选举</description>//		</property>//String zkHostPort = conf.get(CommonConfigurationKeys.ZK_ADDRESS);if (zkHostPort == null) {throw new IOException(CommonConfigurationKeys.ZK_ADDRESS + " is not configured.");}//获取 hadoop.zk.num-retries 的值  默认值 1000//ZooKeeper操作的最大重试次数 int numRetries = conf.getInt(CommonConfigurationKeys.ZK_NUM_RETRIES,CommonConfigurationKeys.ZK_NUM_RETRIES_DEFAULT);//获取 hadoop.zk.timeout-ms 的值 默认值 10000//ZooKeepers操作超时(以毫秒为单位)int zkSessionTimeout = conf.getInt(CommonConfigurationKeys.ZK_TIMEOUT_MS,CommonConfigurationKeys.ZK_TIMEOUT_MS_DEFAULT);//获取 hadoop.zk.retry-interval-ms 的值  默认值 1000 //以毫秒为单位重试ZooKeeper操作的频率int zkRetryInterval = conf.getInt(CommonConfigurationKeys.ZK_RETRY_INTERVAL_MS,CommonConfigurationKeys.ZK_RETRY_INTERVAL_MS_DEFAULT);RetryNTimes retryPolicy = new RetryNTimes(numRetries, zkRetryInterval);//设置ZooKeeper身份验证List<ZKUtil.ZKAuthInfo> zkAuths = getZKAuths(conf);if (authInfos == null) {authInfos = new ArrayList<>();}for (ZKUtil.ZKAuthInfo zkAuth : zkAuths) {authInfos.add(new AuthInfo(zkAuth.getScheme(), zkAuth.getAuth()));}//获取客户端框架CuratorFramework client = CuratorFrameworkFactory.builder().connectString(zkHostPort).sessionTimeoutMs(zkSessionTimeout).retryPolicy(retryPolicy).authorization(authInfos).build();//启动client.start();this.curator = client;}

5、启动Curator的领导人选举服务

  protected void serviceInit(Configuration conf) throws Exception {rmId = HAUtil.getRMHAId(conf);String clusterId = YarnConfiguration.getClusterId(conf);//获取 yarn.resourcemanager.ha.automatic-failover.zk-base-path  的值 默认值 /yarn-leader-election//官网解释:使用基于ZooKeeper的领导人选举时,用于存储领导人信息的基本znode路径。String zkBasePath = conf.get(YarnConfiguration.AUTO_FAILOVER_ZK_BASE_PATH,YarnConfiguration.DEFAULT_AUTO_FAILOVER_ZK_BASE_PATH);latchPath = zkBasePath + "/" + clusterId;//第3步已经设置过了,这里直接取curator = rm.getCurator();//初始化并启动LeaderLatchinitAndStartLeaderLatch();super.serviceInit(conf);}

五、总结

1、判断配置文件中是否配置了HA开启

2、如果开启了HA,开始配置并设置启动必要参数

3、根据配置文件添加选举人

4、获取ZooKeeper Curator管理器,创建并启动

5、连接到ZooKeeper集合

6、获取客户端框架并启动

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

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

相关文章

163基于matlab的不同目标函数的盲源信号分离基于负熵的

基于matlab的不同目标函数的盲源信号分离基于负熵的&#xff1b;基于负熵的改进算法&#xff1b; 基于峭度的&#xff1b;基于互信息的&#xff1b;基于非线性PCA的。输出解混前后信号结果。程序已调通&#xff0c;可直接运行。 163 负熵、峭度、互信息、PCA 信号处理 (xiaohon…

牛客——递归实现组合型枚举(枚举,dfs)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 从 1~n 这 n 个整数中随机选出 m 个&#xff0c;输出所有可能的选择方案。n>0n \gt 0n>0, 0≤m≤n0 \leq m \leq n0≤m≤n, n(n−m)≤25n(n-m)\leq 25n(n−m)≤25。 输入描述…

LeetCode Python - 17.电话号码的字母组合

目录 题目答案运行结果 题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits…

HGAME 2024 WEEK2 Web方向题解 全

---------【WEEK-2】--------- What the cow say? 题目描述&#xff1a;the cow want to tell you something 注意title&#xff0c;Python的flask漏洞可多呢 版本310 先测一下SSTI 正常情况下 SSTI测试 变量渲染测试&#xff0c;被waf了&#xff0c;说明方向对了 单单过滤…

企业人力资源大数据分析解决方案

一、 背景痛点 随着企业发展和市场竞争的加剧,传统的人力资源管理模式已经无法满足企业的需求。而大数据技术的出现,为企业提供了新的解决方案,能够更好地应对市场变化和人力资源挑战。 二、基本人力分析应用 整个人力资源体系是承接集团战略的重要部分,通过对人力资源战…

《小强升职记:时间管理故事书》阅读笔记

目录 前言 一、你的时间都去哪儿了 1.1 你真的很忙吗 1.2 如何记录和分析时间日志 1.3 如何找到自己的价值观 二、无压工作法 2.1 传说中的“四象限法则 2.2 衣柜整理法 三、行动时遇到问题怎么办&#xff1f; 3.1 臣服与拖延 3.2 如何做到要事第一&#xff1f; 3.…

文生图提示词:肖像风格

人物与肖像 --肖像风格 Portrait Styles 覆盖了从技术和媒介到时代和地域特征的广泛肖像风格&#xff0c;展示了人物肖像艺术的多样性和丰富性。 Realistic 现实主义 Abstract 抽象 Impressionistic 印象主义 Expressionistic 表现主义 Surrealistic 超现实主义 Photorealistic…

快速搭建PyTorch环境:Miniconda一步到位

快速搭建PyTorch环境&#xff1a;Miniconda一步到位 &#x1f335;文章目录&#x1f335; &#x1f333;一、为何选择Miniconda搭建PyTorch环境&#xff1f;&#x1f333;&#x1f333;二、Miniconda安装指南&#xff1a;轻松上手&#x1f333;&#x1f333;三、PyTorch与Minic…

kali无线渗透之wps加密模式和破解12

WPS(Wi-Fi Protected Setup&#xff0c;Wi-Fi保护设置)是由Wi-Fi联盟推出的全新Wi-Fi安全防护设定标准。该标准推出的主要原因是为了解决长久以来无线网络加密认证设定的步骤过于繁杂之弊病&#xff0c;使用者往往会因为步骤太过麻烦&#xff0c;以致干脆不做任何加密安全设定&…

JVM工作原理与实战(三十八):JIT即时编译器原理

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、JIT即时编译器 二、HotSpot中的JIT编译器 三、JIT优化技术 1.方法内联 2.逃逸分析 四、JIT优化建议 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字节…

FPGA_简单工程_拨码开关

一 框图 二 波形图 三 代码 3.1 工程代码 module bomakiaguan (input [15:0] switch, // 输入16路拨码开关output reg [15:0] led // 输出16个LED灯 );always (switch) beginled < switch; // 将拨码开关的值直接赋给LED灯 end // 将拨码开关的值直接赋给LED灯 endmodu…

2023全球云计算市场份额排名

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 最近Synergy研究院发布了最新的全球云计算市场份额排名。 亚马逊依旧是以31%的的市场份额排名第一&#xff0c;微软azure24%排名第二&#xff0c;Google云11%排名第三&#xff0c;阿里云4%排名第四。腾讯云和IBM、…

Java常用类与基础API--String的构造器与常用方法

文章目录 一、String的常用API-1&#xff08;1&#xff09;构造器1、介绍2、举例 &#xff08;2&#xff09;String与其他结构间的转换1、基本数据类型、包装类 --> 字符串2、字符串 --> 基本数据类型、包装类3、字符串 --> 字符数组4、字符数组 --> 字符串5、字符…

一个人被锁死在公司底层的根本原因

一、现代社会对员工角色的认知 随着经济全球化和科技进步,现代社会对员工的认知发生了深刻的变化。传统上,员工被视为公司的执行者和生产者,承担着重复性、机械性的工作。然而,随着知识经济和服务型经济的兴起,员工角色逐渐从“执行者”转变为“创造者”和“合作者”。员…

【从0到1学Python】第四讲:Python中的各种“量”(三)

不要着急&#xff01;我们在下一讲就会开始编写如假包换的程序了。 这一讲我们了解一下六种常见类型的量的常用方法&#xff0c;以及不同类型之间的关系。 所谓“方法&#xff08;methods&#xff09;”&#xff0c;我的理解是对于某一个类型的量的某种操作或判断。比如说&…

WEB APIs(1)

变量声明const&#xff08;修饰常量&#xff09; const优先&#xff0c;如react&#xff0c;基本const&#xff0c; 对于引用数据类型&#xff0c;可用const声明&#xff0c;因为储存的是地址 何为APIs 可以使用js操作HTML和浏览器 分类&#xff1a;DOM&#xff08;文档对象…

Java奇缘:林浩然与杨凌芸的数学冒险记

Java奇缘&#xff1a;林浩然与杨凌芸的数学冒险记 Java Adventure: The Mathematical Odyssey of Lin Haoran and Yang Lingyun 在Java编程世界的某一个角落&#xff0c;住着两位才华横溢的程序员——林浩然和杨凌芸。林浩然&#xff0c;人称“算法大侠”&#xff0c;对Java Ma…

【Vue】工程化开发脚手架Vue CLI

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue⛺️稳重求进&#xff0c;晒太阳 工程化开发&脚手架Vue CLI 基本介绍 Vue Cli是Vue官方提供的一个全局命令工具 可以帮助我们快速创建一个开发Vue项目的标准化基础架子【集成了we…

express 定时删除 oss 垃圾图片

一&#xff1a; 删除垃圾图片 思路&#xff1a; 获取 oss 中存储的所有图片文件&#xff1b;获取数据库中存储的图片文件数据&#xff1b;对比差异&#xff0c;不在数据库中的 oss 图片文件即为要删除的垃圾图片。 实现&#xff1a; 1、获取所有 oss 文件 import OSS from…

Pr教程1-8节笔记

第一课 认识PR以及PR的学习方法 学习任务&#xff1a; 1、熟练掌握PR软件&#xff0c;同时掌握剪辑技术以及常用于制作特效的效果器。 2、认识PR软件的名称、主要功能以及用途作用。 3、明白学习PR我们能做些什么以及PR的学习方法。 知识内容&#xff1a; 1、PR是专门用于视…