运行于Yarn的Map Reduce作业,可能发生失败的点包括
- Task Failure
- Application Master Failure
- Node Manager Failure
- Resource Manager Failure
1. Task Failure
任务执行过程中产生的异常和JVM的意外终止会汇报给Application Master。僵死的任务也会被Application Master监测到,这是通过Task和Application Master之间的心跳实现的,对于Applciation Master来说,任务意外终止和任务僵死(长时间不给Application Master发送心跳包,这个心跳时间超时时间可以通过mapreduce.task.timeout进行设置)是一样的。
Hadoop MapReduce如何判定一个任务失败,任务失败是否使得整个作业失败
- 任务有重试机制,如果重试四次任务仍然失败则认为任务彻底失败,不再进行尝试运行。Mapper任务的重试次数以及Reducer任务的重试次数可以分别通过mapreduce.map.maxattempts和mapreduce.reduce.maxattempts进行设置
-
作业失败是根据失败的Mapper Task占Mapper Task的总数百分比和失败的Reducer Task的占Reducer任务总数的百分比进行判定的,这个百分数可以分别通过mapreduce.map.failures.maxpercent以及mapreduce.reduce.failures.maxpercent进行设置
2. Application Master Failure
同任务失败后进行重试一样,Application Master失败也会进行重试,默认情况下,Application Master失败一次,Yarn就认为Application Master失败了,即默认情况下是没有重试机制的。 重试的次数可以通过yarn.resourcemanager.am.max-retries进行次数设置。
作业运行过程中,Application Master会定时的向Resource Manager发送心跳包,如果在给定的时间内Resource Manager没有收到来自Application Master心跳包,那么Resource Manager进行失败检测然后重新启动一个新的Container,然后在这个Container中启动新的Application Master进程。对于新创建的Application Master,它能够检测到之前失败的Application Master已经运行完成的任务,因此,新的Application Master无需重头开始已经执行过的任务。
客户端从Application Master获取任务执行的状态信息,如果Application Master挂了然后新的Application Master启动后,客户端需要知道新的Application Master地址。在Application Master初始化作业时,客户端会向Resource Manager发送请求询问Application Master的地址,然后缓存在客户端本地。如果客户端长时间得不到Application Master的应答,那么客户端会重新向Resource Manager发送请求询问新的Application Master的地址
3. Node Manager failure
如果Node Manager挂了,那么Node Manager停止向Resource Manager发送心跳包,此时,ResourceManager会将它从可用节点中移除。默认情况下,Resource Manager等待10分钟以确定node manager已经挂了。这个时间间隔可以通过yarn.resourcemanager.nm.liveness-monitor.expiry-interval-ms进行设置, 默认600000
Node Manager挂了,那么运行于其上的Task和Application Master都会失败,Application Master和Task的恢复机制前面已有描述。
如果Node Manager本身没有挂,但是运行于这个节点的任务数失败率非常高,那么Application Master将把这个Node Manager加入到黑名单中。(是Application Master将Node Manager加入到了黑名单中)
4. Resource Manager failure
Resource Manager挂了,那么Yarn的各个组件,包括正在执行的作业、任务都会受到影响。Resource Manager的作用如此重要,因此Hadoop提供了检查点不定时的将它的状态持久化到存储系统,以便在它失败后,能够从失败的状态中恢复过来。
Resource Manager挂了之后,系统管理员重新启动一个新的Resource Manager,然后从上个失败的Resource Manager保存的检查点进行状态恢复。保存的状态信息包括包括集群的Node Managers以及正在运行的作业,Task和Application Master不在要恢复的状态中,因为Application Master是由Node Manager管理,Task是由Application Master管理。
用于记录Resource Manager状态信息的存储介质是由yarn.resourcemanager.store.class设置的,这个属性接受一个类,默认是org.apache.hadoop.yarn.server.resourcemanager.recovery.MemStore,即Resource Manager默认将状态信息记录到内存中,这很不合理,如果Resource Manager挂了,内存数据也挤有可能挂了,将状态信息记录到内存中,不知道是怎么考虑的!Resource Manager也可以将状态信息记录到Zookeeper中