任务/application master/NM/RM
任务运行失败
1) 任务代码异常
> JVM在退出前向application master发送错误报告,报告被记录用户日志
> application master将任务标记为failed,释放容器和资源
> 如果是Streaming任务,如果Streaming进程以非零代码退出,则标记为失败
strram.non.zero.exit.is.failure
2) 任务JVM突然退出
> JVM软件缺陷,NM注意到JVM退出,通知application master将任务标记为失败
3) 任务挂起
> application master长时间未接收到进度更新,将任务标记为失败,JVM进程也将会自动杀死
>> 默认超时时间是10min,mapreduce.task.timeout,毫秒单位,如果设置为0,则永远不会被标记为失败,挂起的任务占用资源不释放,降低集群效率,要避免
4) 任务失败处理
> 重新调度任务执行,避免在失败节点尝试重新调度,默认任务失败超过4次,不再重试
mapreduce.map.maxattempts
> 如果希望少数几个任务不影响整体作业的执行,设置任务失败的最大百分比
mapreduce.map.failures.maxpercent/mapreduce.reduce.failures.maxpercent
> 终止或取消任务尝试,因为是推测副本或所处NM失败,导致运行的任务被标记killed,被中止的尝试不计入maxattempts
Web UI或者mapred job命令
application master运行失败
1) MapReduce任务时application master做多尝试次数:mapreduce.am.max-attempts属性默认为2
2) YARN上的application master最大尝试次数: yarn.resourcemanager.am.max-attempts属性默认为2,如果要增加MR程序的尝试次数,先增加YARN上的次数
3) 恢复过程:
> YARN: application master向RM发送周期心跳,失败时,RM检测到失败并通知NM管理一个新的容器开始一个新的application master
> MR: 使用作业历史恢复失败的应用程序任务状态,不需要重新运行
> 恢复功能 yarn.app.mapreduce.am.job.reduce.enable
4) 作业初始化时,客户端向RM询问application master的地址并在客户端缓存地址,不需要每次都重载RM,如果application master运行失败,则必须向RM请求新的地址。
NM运行失败
1) NM崩溃或因运行十分缓慢而失败,会停止向RM发送心跳
2) RM长时间未收到NM的心跳,则从自己的NM池中移除,调度新的容器
yarn.resourcemanager.nm.liveness-monitor.expiry-internal-ms 默认10min
3) 作业尚未完成时,需要重新运行已完成的map任务,因为任务的中间输出保留在失败NM上,无法被reduce访问
4) NM上运行失败次数过高,可以拉黑NM。application master管理黑名单
mapreduce.job.maxtaskfailures.per.tracker 默认3次
RM运行失败
1) 需要实现RM HA,实现热备
2) 所有运行中的应用程序的信息存储在一个高可用的状态存储区(Zookeeper/HDFS备份)
3) 恢复
> 启动备用RM,从状态存储区读取应用程序信息
> 未集群所有应用程序重启application master,不被计入yarn.resourcemanager.am.max-attempts
因为应用程序不是程序代码问题,是系统强行终止
4) 切换由failover controller故障转移控制器,Zookeeper的leader选举机制确保只有一个RM,故障转移控制器默认是嵌入在RM中的,自动工作。
5) 客户端和NM向两个RM都轮询,直到发现主RM,故障时,直到备用RM转移为主RM