对于 YARN 的异常处理来说,需要对运行过程中所有的过程对象进行处理,这其中包括当前任务发生的异常,对任务调度器,节点管理器和资源管理器的处理等。
首先对于任务失败,与 MapReduce 任务失败相类似,直接报出运行异常并且从所运行的 JVM 中退出,其中 Task Attempt 失败这个消息会通知 Application Master,由 Application Master 标记其为失败。
当 Task 失败的比例大于MapReduce.Map.failures.maxpercent(Map)或者 MapReduce.Reduce.failures.maxpercent(reduece)时候, Job 失败。
而对于 Application Master 失败来说,当 Application Master 失败,会被标记为失败,这时候 Resource Manager 会立刻探寻到 Application Master 的失败,并新实例化一个Application Mast 和借助 NodeManager 建造新的相应的 Container ,并且在设置yarn.app.MapReduce.am.job.recovery.enable 为 true 情况下失败情况下尝试将
Application Master 恢复,并且恢复后并不返回。默认情况下,失败 Application Master会让所有的 Task 返回
如果客户端轮询得知 Application Master 失败后,经过一段时间失败状态仍然没有改变,则重新向 ResourceManager 申请相应的资源。
当 Node Manager 的失败,会停止向 Resource Manager 发送心跳,则 Resource Manager会将这个 Node Manager 从可用的 Node Manager 池中移出,心态间隔时间可由yarn.resourcemanager.nm.liveness-monitor.expiry-interval-ms 设置,默认是 10 分钟
同样的与经典 MapReduce 类似,如果 Node Manager 上 Application Manager 失败次数过高,此 Node Manager 会被列入黑名单, Application Manager 会在不同 Node 上重新运行Task。
所有的错误中 Resources Manager 失败是最为严重的,因为没有 Resources Manager则没有任何一个任务或任务容器能够被配置和调度。为了解决一旦 Resources Manager 发生异常则整个集群陷入瘫痪, YARN 采用了 checkpointing 尝试去重建 Resources Manager。这个功能目前为止还在开发中。