MR作业失败一般考虑下面四个实体的问题:
- 任务运行失败
- AM运行失败
- NM运行失败
- RM运行失败
失败情况严重程度同以上排序,RM运行失败最为严重。
一. 任务运行失败
1. 任务失败常见的两种原因
- 用户代码抛出运行异常
此异常是最为常见的异常,一般由用户代码异常引发。如果发生这种异常,任务JVM会在退出之前向其父AM发送错误报告,错误报告最后被计入用户错误日志,AM将该任务标记为失败,并释放容器资源供其他任务使用。
streaming任务的推出标志为0,若任务以非0退出,则会被标记为失败。1 - JVM异常
由JVM异常退出引发,此问题会被NM发现,然后NM通知AM将该任务标记为失败。
2. 任务挂起
- 默认情况下,如果AM在10分钟2内没有收到任务的进度更新,则会将任务标记为失败,在此之后,任务JVM将会被自动杀死。
- streaming进程挂起后,一般情况下,其进程会堆积在系统中,除非
yarn.nodemanager.container-executor.class
被定义为org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor
或者默认的容器执行器正在被使用且系统可以使用setid命令。3 - 任务超时时间设置为0意味着长时间运行的任务永远不会被标记为失败,这种情况下被挂起的资源永远不会释放容器。若单个任务时间较长时,可以稍微调大超时时间,但不应该关闭该时间。
3. 任务尝试(task attempt)
- 所谓任务尝试,即当一个任务失败后,AM重新尝试执行该任务的过程。任务尝试会尽量避免在以前失败过的节点管理器上重新运行尝试任务,一个任务最多被尝试运行4次4,如果失败次数大于4次,则整个job会失败。
- 若不希望因为一个任务失败即退出job,可以通过设置
mapreduce.map.failures.maxpercent
和mapreduce.reduce.failures.maxpercent
两个属性实现。 - 任务尝试的任务被终止(kill)时不会被计入任务尝试次数(待查)。可以通过WEB UI 和
mapred job
选项kill。
二. AM运行失败
1. 如何检测失败
AM会向RM发送周期性心跳,若RM一段时间后未收到AM心跳,则认为该AM已经失败。
2 失败后的重试参数5
AM失败后,也会进行重试。MR任务最多尝试次数由mapreduce.am.max-attempts
属性设置,默认为2。yarn对集群上运行的yarn AM的最多尝试次数设了限制,由mapreduce.resourcemanager.am.max-attempts
属性设置,默认为2。若想增加AM尝试次数,则应该同时修改以上两处。
3. 恢复流程
RM检测到AM失败,然后RM会在一个新的容器(可能位于不同节点中)中重新运行AM(AM由新节点NM管理),并通过作业历史来恢复失败的应用程序所运行的状态。默认情况下该流程是开启的,也可以通过yarn.app.mapreduce.am.job.recovery.enable
为false关闭。
4. 失败后CLI如何寻找新的AM位置
因为CLI确定job状态是通过轮训AM然后缓存其地址实现的,若旧AM失败后,CLI变回轮训超时,此时,CLI便会向RM请求新的AM地址并缓存。
三. NM失败
1. 如何检测失败
NM会向RM发送周期性心跳,若RM一段时间后(默认10min6)未收到AM心跳,则认为该AM已经失败。
2 失败后的操作
NM失败后,RM会将该节点从自己的节点池中移除。
3. 恢复流程
同以上流程不同,NM失败后,所恢复的是原来NM上运行的AM、任务等,恢复机制同上。由于之前未完成的map任务的中间结果仍然在原NM中,因此恢复后,AM会重新运行这些map任务。
4. NM黑名单制度
AM有NM的黑名单。如果一个NM上有超过三个任务失败,则会将该NM拉黑。该阙值由mapreduce.job.maxtaskfaultures,pers.tracker
设置。
由于RM没有NM的黑名单,因此若NM失败节点上正好运行着该job的AM,则新任务仍然可能被调度到黑名单节点中。
四. RM失败
RM一般不会失败,RM失败是一个十分严重的问题。所有运行中的应用会保存在一个高可用的状态存储区(一般为Zookeeper或HDFS)中。
在双机热备情况下运行一对资源管理器是必要的,备用资源管理器会接管,做到无缝。
在非双机热备情况下,新资源管理器会读取应用程序信息,然后为所有应用重启AM,这个行为不会计入AM恢复次数。
RM从备机到主机切换由故障转移控制器处理,默认是自动工作的,使用Zookeeper的leader机制实现唯一RM。
为应对RM失败,一般情况下,CLI和NM都会轮训两个RM。
属性由
stream.non.zero.exit.is.failure属性(true)
控制。 ↩︎属性由
mapreduce.task.timeout
控制,默认10分钟,单位毫秒。 ↩︎本条摘自hadoop权威指南,暂时未理解。 ↩︎
map任务由
mapreduce.map.maxattempts
控制,reduce任务由mapreduce.reduce.maxattempts
属性控制。 ↩︎关于yarn AM 与MR AM:yarn诞生于hadoop2,yarn作为一种独立的资源框架,mapreduce只是其的一种应用。因此yarn AM权限大于MR AM。 ↩︎
属性由
yarn.resourcemanager.nm.liveness-monitor.expiry-interval-ms
设置,单位为毫秒。 ↩︎