YARN源码分析(三)-----ResourceManager HA之应用状态存储与恢复

前言

任何系统即使做的再大,都会有可能出现各种各样的突发状况。尽管你可以说我在软件层面上已经做到所有情况的意外处理了,但是万一硬件出问题了或者说物理层面上出了问题,恐怕就不是多写几行代码能够立刻解决的吧,说了这么多,无非就是想强调HA,系统高可用性的重要性。在YARN中,NameNode的HA方式估计很多人都已经了解了,那本篇文章就来为大家梳理梳理RM资源管理器HA方面的知识,并不是指简单的RM的HA配置,确切的说是RM的应用状态存储于恢复。


RM应用状态存储使用

RM应用状态存储是什么意思呢,我们知道,RM全称ResourceManager,好比一个大管家,他不仅要与各个节点上的ApplicationMaster进行通信,还要与NodeManager进行心跳包的传输,自然在RM上会注册进来很多的应用,每个应用由1个ApplicationMaster负责掌管整个应用周期。既然RM角色这么重要,就有必要保存一下RM的信息状态,以免RM进程异常退出导致的应用状态信息丢失,RM重启无法重跑之前的应用的现象。


保存什么应用信息

既然目标已经明确了,那么在YARN中,保存的应用信息到底是哪些数据信息呢,应用状态信息只是1个笼统的概念。下面用一张图来表示。


可以看到,这是一张分层多叉树的形状,这个图类似于MapReduce作用运行的分层执行状态图,做个简单介绍,最上面就是1个RMState的状态,这个状态中包含若干个ApplicationState的应用状态信息,每个应用状态信息中包含了很多歌应用尝试信息状态。


应用状态信息如何保存

RM应用状态信息保存的方式又哪些呢:

1.MemoryRMStateStore--信息状态保存在内存中的实现类。

2.FileSystemRMStateStore--信息状态保存在HDFS文件系统中,这个是做了持久化了。

3.NullRMStateStore--do nothing,什么都不做,就是不保存应用状态信息。

4.ZKRMStateStore--信息状态保存在Zookeeper中。

由于我分析的源码中还没有ZKRMStateStore这个类,所以只针对前3种做一个简单的介绍。上面列举的几个类都是具体实现类,那么就一定存在更加上层级的类来定义更基本的变量和方法,答案是RMStateStore类,所以继承关系就是下面这张图所表示


下面蓝色箭头所表示的意思实现类的依托对象。具体什么意思,看接下来的源码分析。首先RMStateStore类对象

/**
 * Base class to implement storage of ResourceManager state.
 * Takes care of asynchronous notifications and interfacing with YARN objects.
 * Real store implementations need to derive from it and implement blocking
 * store and load methods to actually store and load the state.
 * 保存RM资源状态信息的基类,也是一个服务对象类
 */
public abstract class RMStateStore extends AbstractService {
 
  ....


  /**
   * State of an application attempt
   * 一次应用尝试状态信息类
   */
  public static class ApplicationAttemptState {
  	//应用尝试ID
    final ApplicationAttemptId attemptId;
    //主容器
    final Container masterContainer;
    //凭证信息
    final Credentials appAttemptCredentials;

    ....
  }
  
  /**
   * State of an application application
   * 应用状态信息类
   */
  public static class ApplicationState {
  	//应用提交上下文对象
    final ApplicationSubmissionContext context;
    //应用提交时间
    final long submitTime;
    //提交者
    final String user;
    //应用尝试信息对
    Map<ApplicationAttemptId, ApplicationAttemptState> attempts =
                  new HashMap<ApplicationAttemptId, ApplicationAttemptState>();
    
    ....
  }

  public static class RMDTSecretManagerState {
    // DTIdentifier -> renewDate
    //RM身份标识符ID对时间的映射
    Map<RMDelegationTokenIdentifier, Long> delegationTokenState =
        new HashMap<RMDelegationTokenIdentifier, Long>();

    Set<DelegationKey> masterKeyState =
        new HashSet<DelegationKey>();

    int dtSequenceNumber = 0;

    ....
  }

  /**
   * State of the ResourceManager
   * RM状态信息类
   */
  public static class RMState {
  	//RM中的应用状态对图
    Map<ApplicationId, ApplicationState> appState =
        new HashMap<ApplicationId, ApplicationState>();

    RMDTSecre
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值