6.5 任务执行

本章前面详细介绍了MapReduce作业的执行流程,也简单介绍了基于Hadoop自身的一些参数优化。本节再介绍一些Hadoop在任务执行时的具体策略,让读者进一步了解MapReduce任务的执行细节,以便控制细节。

6.5.1 推测式执行

所谓推测式执行是指当作业的所有任务都开始运行时,JobTracker会统计所有任务的平均进度,如果某个任务所在的TaskTracker节点由于配置比较低或CPU负载过高,导致任务执行的速度比总体任务的平均速度要慢,此时JobTracker就会启动一个新的备份任务,原有任务和新任务哪个先执行完就把另外一个kill掉,这就是经常在JobTracker页面看到任务执行成功、但是总有些任务被kill的原因。

MapReduce将待执行作业分割成一些小任务,然后并行运行这些任务,提高作业运行的效率,使作业的整体执行时间少于顺序执行的时间。但很明显,运行缓慢的任务(可能因为配置问题、硬件问题或CPU负载过高)将成为MapReduce的性能瓶颈。因为只要有一个运行缓慢的任务,整个作业的完成时间将被大大延长。这个时候就需要采用推测式执行来避免出现这种情况。当JobTracker检测到所有任务中存在运行过于缓慢的任务时,就会启动另一个相同的任务作为备份。原始任务和备份任务中只要有一个完成,另一个就会被中止。推测式执行的任务只有在一个作业的所有任务开始执行之后才会启动,并且只针对运行一段时间之后、执行速度慢于整个作业的平均执行速度的情况。

推测式执行在默认情况下是启用的。这种执行方式有一个很明显的缺陷:对于由于代码缺陷导致的任务执行速度过慢,它所启用的备份任务并不会解决问题。除此之外,因为推测式执行会启动新的任务,所以这种执行方式不可避免地会增加集群的负担。所以在利用Hadoop集群运行作业的时候可以根据具体情况选择开启或关闭推测式执行策略(通过设置mapred.map.tasks.speculative.execution和mapred.reduce.tasks.speculative.execution属性的值来为Map和Reduce任务开启或关闭推测式执行策略)。