Hadoop-Yarn-ResourceManagerHA

news2024/11/24 22:55:05

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

一、介绍

在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、获取客户端框架并启动

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

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

相关文章

[职场] 公安管理学就业方向及前景 #媒体#笔记#笔记

公安管理学就业方向及前景 公安管理学是中国普通高等学校本科专业。本专业文理兼收&#xff0c;学制4年&#xff0c;授予法学学士学位。本专业培养掌握马克思主义基本原理&#xff0c;政治坚定&#xff0c;坚持党和国家的路线、方针、政策&#xff0c;具有良好职业素养、科学素…

Makefile编译原理 make 中的路径搜索_1

一.make中的路径搜索 问题&#xff1a;在实际的工程项目中&#xff0c;所有的源文件和头文件都放在同一个文件夹中吗&#xff1f; 实验1 &#xff1a; VPATH 引子 mhrubuntu:~/work/makefile1/17$ ll total 28 drwxrwxr-x 4 mhr mhr 4096 Apr 22 00:46 ./ drwxrwxr-x 7 mhr m…

双指针-two pointers的应用

1.枚举输出解法&#xff1a; #include <iostream> using namespace std; int num[1000]; int main(){int result,n;cin>>result>>n;for(int i0;i<n;i)cin>>num[i];for(int i0;i<n;i)for(int ji1;j<n;j)if(num[i]num[j]result)cout<<nu…

操作系统——内存管理(附带Leetcode算法题LRU)

1.内存管理主要用来干什么&#xff1f; 操作系统的内存管理主要负责内存的分配与回收、内存扩充(虚拟技术)、地址转换(逻辑-物理)、内存保护(保证各进程在自己的内存空间运行&#xff0c;不会越界访问)..... 2.什么是内存碎片&#xff1f; 内存碎片是内存的申请和释放产生的…

SpringBoot3整合Knife4j

前置&#xff1a; 官网&#xff1a;快速开始 | Knife4j gitee&#xff1a;swagger-bootstrap-ui-demo: knife4j 以及swagger-bootstrap-ui 集成框架示例项目 - Gitee.com 1.依赖引入&#xff1a; ps&#xff1a;json处理需要引入相关包 <dependency><groupId>c…

【GAMES101】Lecture 21 动画

目录 关键帧&#xff08;Keyframe animation&#xff09; 物理仿真&#xff08;Physical simulation&#xff09; 质点弹簧系统 粒子系统 运动学&#xff08;Kinematics&#xff09; 正运动学&#xff08;Forward Kinematics&#xff09; 逆运动学&#xff08;Inverse K…

【MySQL】-18 MySQL综合-4(MySQL储存引擎精讲+MySQL数据类型简介+MySQL整数类型+MySQL小数类型)

MySQL储存引擎精讲MySQL数据类型简介MySQL整数类型MySQL小数类型 十一 MySQL存储引擎精讲11.1 什么是存储引擎11.2 MySQL 5.7 支持的存储引擎11.3 如何选择 MySQL 存储引擎11.4 MySQL 默认存储引擎 十二 MySQL数据类型简介12.1 MySQL 常见数据类型1) 整数类型2) 日期/时间类型3…

Day30 回溯算法part06

又是眼红别人的一天 重新安排行程 菜鸡思路&#xff1a;把从jfk往下所有的情况都列举出来&#xff0c;result数组包含五个元素的时候返回数组。 我们只需要找到一个行程&#xff0c;就是在树形结构中唯一的一条通向叶子节点的路线 N皇后 这个isValid函数也很不好想啊 首先…

blender怎么保存窗口布局,怎么设置默认输出文件夹

进行窗口布局大家都会&#xff0c;按照自己喜好来就行了&#xff0c;设置输出文件夹如图 这些其实都简单。关键问题在于&#xff0c;自己调好了窗口布局&#xff0c;或者设置好了输出文件夹之后&#xff0c;怎么能让blender下次启动的时候呈现出自己设置好的窗口布局&#xff…

【leetcode热题100】反转链表 II

给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a;[1,4,3,2…

bugku 1

Flask_FileUpload 文件上传 先随便传个一句话木马 看看回显 果然不符合规定 而且发现改成图片什么的都不行 查看页面源代码&#xff0c;发现提示 那应该就要用python命令才行 试试ls 类型要改成图片 cat /flag 好像需要密码 bp爆破 根据提示&#xff0c;我们先抓包 爆破 …

Windows安全中心显示页面不可用

2024年2月过年当天重装电脑之后&#xff0c;第二天&#xff08;还是第三天&#xff09;安全中心开始提示如标题所示的问题。 问题环境 Windows 11 家庭中文版23H2安装日期2024/‎2/‎10 我解决之前没有截图&#xff0c;所以此处放一个别人的图做示例。 实际解决方式 搜索了…

用code去探索理解Llama架构的简单又实用的方法

除了白月光我们也需要朱砂痣 我最近也在反思&#xff0c;可能有时候算法和论文也不是每个读者都爱看&#xff0c;我也会在今后的文章中加点code或者debug模型的内容&#xff0c;也许还有一些好玩的应用demo&#xff0c;会提升这部分在文章类型中的比例 今天带着大家通过代码角度…

[算法前沿]--059-大语言模型Fine-tuning踩坑经验之谈

前言 由于 ChatGPT 和 GPT4 兴起,如何让人人都用上这种大模型,是目前 AI 领域最活跃的事情。当下开源的 LLM(Large language model)非常多,可谓是百模大战。面对诸多开源本地模型,根据自己的需求,选择适合自己的基座模型和参数量很重要。选择完后需要对训练数据进行预处…

Redis——缓存的持久化

1、持久化机制 Redis的所有数据都保存在内存中&#xff0c;如果没有配置持久化功能&#xff0c;Redis重启后数据就会全部丢失&#xff0c;所以需要开启Redis的持久化功能&#xff0c;将数据保存到磁盘上&#xff0c;这样当Redis重启后&#xff0c;可以从磁盘中恢复数据。Redis…

第六篇【传奇开心果系列】Vant of Vue 开发移动应用示例:深度解析响应式布局支持

传奇开心果系列 系列博文目录Vant开发移动应用示例系列 博文目录前言一、Vant响应式布局介绍二、媒体查询实现响应式布局示例代码三、短点设置实现响应式布局示例代码四、响应式工具类实现响应式布局示例代码五、栅格系统实现响应式布局示例代码六、响应式组件实现响应式布局示…

LeetCode.144. 二叉树的前序遍历

题目 144. 二叉树的前序遍历 分析 这道题目是比较基础的题目&#xff0c;我们首先要知道二叉树的前序遍历是什么&#xff1f; 就是【根 左 右】 的顺序&#xff0c;然后利用递归的思想&#xff0c;就可以得到这道题的答案&#xff0c;任何的递归都可以采用 栈 的结构来实现…

【单片机】简单的自定义延时程序设计(代码演示)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY…

洛谷UVA题目Unknown Error

UnexpectedResponseStatus: expect status code: 301 Moved Permanently on https://onlinejudge.org/index.php?optioncom_comprofiler&tasklogin, got: 200 OK 如果你绑定了账号&#xff0c;去原站Online Judge - Home 登录一下&#xff0c;好久没登陆&#xff0c;需要激…

ElasticSearch级查询Query DSL上

目录 ES高级查询Query DSL match_all 返回源数据_source 返回指定条数size 分页查询from&size 指定字段排序sort 术语级别查询 Term query术语查询 Terms Query多术语查询 exists query ids query range query范围查询 prefix query前缀查询 wildcard query通…