6.5 容错机制
6.5.1 JobTracker容错
在MapReduce中,JobTracker掌握着整个集群的运行时信息,包括节点健康状况、资源分布情况以及所有作业的运行时信息等。如果JobTracker因故障而重启,部分信息很容易通过心跳机制重新构造,比如节点健康情况和资源分布情况;但对于作业的运行时信息而言,可能将会全部丢失,这使得用户不得不重新提交未运行完成的作业,这意味着之前已经运行完成的任务不得不重新运行,进而造成资源浪费。从以上分析可看出,JobTracker容错的关键技术点是如何保存和恢复作业的运行时信息。
从作业恢复粒度角度看,当前存在三种不同级别的恢复机制,级别由低到高依次是作业级别、任务级别和记录级别,其中,级别越低,实现越简单,但造成的资源浪费越严重。在1.0.0以及之前版本中,Hadoop采用了任务级别的恢复机制[1],即以任务为基本单位进行恢复,这种机制是基于事务型日志完成作业恢复的,它只关注两种任务:运行完成的任务和未运行完成的任务。作业执行过程中,JobTracker会以日志的形式将作业以及任务状态记录下来,一旦JobTracker重启,则可从日志中恢复作业的运行状态,其中已经运行完成的任务无须再运行,而未开始运行或者运行中的任务需重新运行。这种方案实现比较复杂,需要处理的特殊情况比较多,为了简化设计,从0.21.0版本开始,Hadoop采用了作业级别的恢复机制[2]。该机制不再关注各个任务的运行状态,而是以作业为单位进行恢复,它只关注两种作业状态:运行完成或者未运行完成。当JobTracker重启后,凡是未运行完成的作业将自动被重新提交到Hadoop中重新运行。除了这两种方案,学术界还尝试着研究记录级别的恢复机制[3]。该机制尝试着从失败作业的第一条尚未处理的记录(断点)开始恢复一个任务,以尽可能地减少任务重新计算的代价。
[1]https://issues. apache.org/jira/browse/HADOOP-3245
[2]https://issues. apache.org/jira/browse/MAPREDUCE-873
[3]Jorge-Arnulfo Quian-Ruiz, Christoph Pinkel, Jörg Schad, Jens Dittrich.RAFTing MapReduce:Fast recovery on the RAFT.In Serge Abiteboul, Klemens Böhm, Christoph Koch, Kian-Lee Tan, editors, Proceedings of the 27th International Conference on Data Engineering, ICDE 2011,April 11-16,2011,Hannover, Germany.