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.address
        verifyAndSetAllServiceAddresses(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(Configuration
      config) 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();
    //初始化并启动LeaderLatch
    initAndStartLeaderLatch();
    super.serviceInit(conf);
  }

五、总结

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

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

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

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

5、连接到ZooKeeper集合

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

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

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

相关文章

python+flask+django农产品供销展销电子商务系统lkw43

供销社农产品展销系统的设计与实现&#xff0c;最主要的是满足使用者的使用需求&#xff0c;并且可以向使用者提供一些与系统配套的服务。本篇论文主要从实际出发&#xff0c;采用以对象为设计重点的设计方法&#xff0c;因此在进行系统总体的需求分时借助用例图可以更好的阐述…

备战蓝桥杯---搜索(进阶4)

话不多说&#xff0c;直接看题&#xff1a; 下面是分析&#xff1a; (ab)%c(a%cb%c)%c; (a*b)%c(a%c*b%c)%c; 因此&#xff0c;如果两个长度不一样的值%m为相同值&#xff0c;那就舍弃长的&#xff08;因为再加1位只不过是原来值*10那位值&#xff0c;因此他们得出的%m还是同…

【Effective Objective - C 2.0】——读书笔记(二)

文章目录 前言六、理解“属性”这一概念七、在对象内部尽量直接访问实例变量八、理解“对象等同性”这一概念九、以“类族模式”隐藏实现细节十、在既有类中使用关联对象存放自定义数据十一、理解objc_msgSend的作用十二、理解消息转发机制动态方法解析备援接受者完整的消息转发…

PE 特征码定位修改程序清单 uiAccess

requestedExecutionLevel level"asInvoker" uiAccess"false" 可以修改这一行来启用禁用原程序的盾牌图标&#xff0c;似乎作用不大。以前没事写的一个小玩意&#xff0c;记录一下。 等同于这里的设置&#xff1a; 截图 代码如下&#xff1a; #include …

mac卸载被锁定的app

sudo chflags -hv noschg /Applications/YunShu.app 参考&#xff1a;卸载云枢&#xff08;MacOS 版&#xff09;

Java 学习和实践笔记(6)

各数据类型所占的空间&#xff1a; byte: 1个字节 short&#xff1a;2个字节 int&#xff1a;4个 long&#xff1a;8个 float&#xff1a;4个 double: 8个 char:1个 boolean:1bit 所有引用数据类型都是4个字节&#xff0c;实际其值是指向该数据类型的地址。 上图中稍特…

【iOS】——使用ZXingObjC库实现条形码识别并请求信息

文章目录 前言一、实现步骤二、扫描界面和扫描框的样式1.扫描界面2.扫描框 三、实现步骤 前言 ZXing库是一个专门用来解析多种二维码和条形码&#xff08;包括包括 QR Code、Aztec Code、UPC、EAN、Code 39、Code 128等&#xff09;的开源性质的处理库&#xff0c;而ZingObjC库…

单片机学习笔记---AT24C02(I2C总线)

目录 有关储存器的介绍 存储器的简介 存储器简化模型 AT24C02介绍 AT24C02引脚及应用电路 I2C总线介绍 I2C电路规范 开漏输出模式和弱上拉模式 其中一个设备的内部结构 I2C通信是怎么实现的 I2C时序结构 起始条件和终止条件 发送一个字节 接收一个字节 发送应答…

Failed to construct ‘RTCIceCandidate‘ sdpMid and sdpMLineIndex are both null

最近在搞webrtc&#xff0c;在编写函数处理远端传递来的candidate时报错了&#xff0c;具体信息如下。国内关于webrtc的资料很少&#xff0c;所以去国外社区转了一圈&#xff0c;回来记录一下报错的解决方案 其实这个bug也好解决&#xff0c;根据报错信息可以判断是RTCIceCand…

【数据库】Unlogged 表使用

【数据库】Unlogged 表使用 前言普通表和Unlogged 表的写性能比较普通表创建和数据插入Unlogged 表创建和数据插入比较结果 Unlogged 表崩溃和正常关闭测试Unlogged 表特点总结 前言 大神偶像在开会上提及了Unlogged 表&#xff0c;它的特点很不错&#xff0c;很适合实时数据保…

图(高阶数据结构)

目录 一、图的基本概念 二、图的存储结构 2.1 邻接矩阵 2.2 邻接表 三、图的遍历 3.1 广度优先遍历 3.2 深度优先遍历 四、最小生成树 4.1 Kruskal算法 4.2 Prim算法 五、最短路径 5.1 单源最短路径-Dijkstra算法 5.2 单源最短路径-Bellman-Ford算法 5.3 多源最…

代码随想录算法训练营第四十九天(动态规划篇之01背包)| 474. 一和零, 完全背包理论基础

474. 一和零 题目链接&#xff1a;https://leetcode.cn/problems/ones-and-zeroes/submissions/501607337/ 思路 之前的背包问题中&#xff0c;我们对背包的限制是容量&#xff0c;即每个背包装的物品的重量和不超过给定容量&#xff0c;这道题的限制是0和1的个数&#xff0…

C语言学习记录

小飞机_牛客题霸_牛客网 (nowcoder.com) 飞机翅膀12个*&#xff0c;第一行按5下空格&#xff0c;再按两下*&#xff0c;再按5下空格&#xff0c;最后一行按4下空格&#xff0c;再按一下*&#xff0c;再按两下空格&#xff0c;再按一下*&#xff0c;再按4下空格 数格子就完了&a…

优秀!护理学者用CLHLS数据库发表二区文章 IF=6.6

编者 近日&#xff0c;我们关注到一篇发表在《Journal of Affective Disorders》&#xff08;二区&#xff0c;IF6.6&#xff09;的精彩文章。研究者们利用潜在剖面分析方法&#xff0c;利用中国老年健康影响因素跟踪调查数据&#xff08;CLHLS&#xff09;&#xff0c;深入研究…

项目02《游戏-14-开发》Unity3D

基于 项目02《游戏-13-开发》Unity3D &#xff0c; 任务&#xff1a;战斗系统之击败怪物与怪物UI血条信息 using UnityEngine; public abstract class Living : MonoBehaviour{ protected float hp; protected float attack; protected float define; …

C++入门(上)

文章目录 1:什么是C2.C的发展史3:C关键字(C98)4:命名空间4.1:命名空间的概念4.2:命名空间的定义4.3:命名空间的使用4.3.1加命名空间的名称以及域作用限定符4.3.2:使用using将命名空间中某个成员引入4.3.3:使用using namespace 命名空间名称展开命名空间代码1代码2 5:C输入与输出…

React Native开发iOS实战录

文章目录 背景环境准备主要工具xcode安装安装CocoaPods 基本步骤常见问题ruby3在macOS上编译失败import of module ‘glog.glog.log_severity’ appears within namespace ‘google’yarn网络问题pod安装失败unable to open settings file 相关链接 背景 准备将之前的一个Reac…

【复现】大华 DSS SQL 注入漏洞_46

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 大华DSS是大华的大型监控管理应用平台&#xff0c;支持几乎所有涉及监控等方面的操作&#xff0c;支持多级跨平台联网等操作。 可…

python+django咖啡网上商城网站

全网站共设计首页、咖啡文化、咖啡商城、个人信息、联系我们5个栏目以及登录、注册界面&#xff0c;让用户能够全面的了解中国咖啡咖啡文化宣传网站以及一些咖啡知识、文化。 栏目一首页&#xff0c;主要放置咖啡的起源及发展进程的图文介绍&#xff1b;栏目二咖啡文化&#xf…

BKP寄存器与RTC实时时钟

BKP寄存器 BKP寄存器简介 BKP&#xff08;Backup Registers&#xff09;备份寄存器 BKP可用于存储用户应用程序数据。当VDD&#xff08;2.03.6V&#xff09;电源被切断&#xff0c;他们仍然由VBAT&#xff08;1.83.6V&#xff09;维持供电。当系统在待机模式下被唤醒&#xf…