YARN/MRv2 MRAppMaster深入剖析—作业恢复

在MRAppMaster中,记录日志是由服务JobHistoryEventHandler完成的,而作业恢复是由服务RecoveryService完成的。

同MRv1一样,MRv2也会对一些关键的事件记录日志,这主要有两个作用:(1)方便用户查看历史作业运行信息 (2)作业因故障重新启动后,可根据日志信息恢复之前已经运行完成的任务,以减少重新计算代价。

MRAppMaster采用的日志格式与MRv1一样,但有两个小的改动:

(1)实现方式不同。MRv1采用了同步记录日志的方式,也就是说,每发生一个行为,会记录一次日志,然后才可以执行下面的代码。由于YARN引入了基于事件的异步编程模型,因此,MRAppMaster也采用了异步方式记录日志。

(2)存储位置不同。尽管MRv1允许用户将作业日志存放到HDFS上,但默认是存储到本地的,MRAppMaster则不同,它直接将日志写到HDFS上,这样,当MRAppMaster失败后,另一个MRAppMaster启动时,可直接读取HDFS中上一个作业产生的日志,以恢复已经运行完成的任务。

当前MRAppMaster记录的日志事件包括以下几类:

作业恢复的过程是重新解析作业日志,以恢复各个任务运行状态的过程(重做日志),这是由RecoveryService完成的。如果用户将yarn.app.mapreduce.am.job.recovery.enable参数置为true(默认就是true),则MRAppMaster运行作业之前,首先会检查这是否是第一次运行该作业,如果不是,则从HDFS上读取上次运行的作业日志,并恢复作业的运行状态,然后才会按照正常流程执行。相关代码如下(在MRAppMaster类中):

public void init(final Configuration conf) {

  boolean recoveryEnabled = conf.getBoolean(

  MRJobConfig.MR_AM_JOB_RECOVERY_ENABLE, true);

  boolean recoverySupportedByCommitter = committer.isRecoverySupported();

  if (recoveryEnabled && recoverySupportedByCommitter
    && appAttemptID.getAttemptId() > 1) {

    LOG.info("Recovery is enabled. " + "Will try to recover from previous life on best effort basis.");
    recoveryServ = createRecoveryService(context);
    addIfService(recoveryServ);
    dispatcher = recoveryServ.getDispatcher();
    clock = recoveryServ.getClock();
    inRecovery = true;
  }
}

public void start() {

  if (inRecovery) {
    completedTasksFromPreviousRun = recoveryServ.getCompletedTasks();
    amInfos = recoveryServ.getAMInfos();
  }
  ……

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值