在上一篇文章中,我们介绍了TaskAttempt是如何做到容错的。我们可以看到,TaskAttempt的容错很简单,就是ApplicationMaster让ResourceManager重新分配一个Container,就好了。
而除了TaskAttempt需要容错之外,ApplicationMaster更需要容错性。毕竟它相当于MapReduce的大脑。在这篇文章中,我们会详细介绍这个过程。
其实ApplicationMaster的容错也是蛮简单的。
从ApplicationMaster的启动过程中,我们可以看到,它会调用一个叫做processRecovery()的方法。
顾名思义,这个方法就是用于故障恢复的。
我们来大体看一下这个方法的实现:
我们可以看到,会首先检查我们是否设置了允许ApplicationMaster,以及OutputCommitter是否支持Recovery,最后会检查你设置的Reducer的数量是否大于0,以及Shuffle key是否有效。
我们可以看到,如果你设置的Reduce的数量大于0,并且shuffle key无效,那么是不会进行recovery的。
我们来看看是如何进行recovery的。在parsePreviousJobHistory()这个方法中:
我们可以看到,就是读取JobHistory进行恢复的。
从TaskImpl中,我们能够看到,当一个Task执行成功时,就会写入到JobHistory: