MapReduce任务的推测执行

MapReduce模型将作业分解成任务,然后并行地运行任务以使作业的整体执行时间少于各个任务顺序执行的时间。这使作业执行时间对于运行缓慢的任务很敏感,因为只运行一个缓慢的任务会使整个作业所用的时间远远长于执行其他任务的时间。当一个作业由几百或几千个任务组成时,可能出现少数“拖后腿”的任务,这是很常见的。

任务执行缓慢可能有多种原因,包括硬件老化或软件配置错误,但是,检测具体原因很困难,因为任务总能够成功完成,尽管比预计执行时间长。Hadoop不会尝试诊断或修复执行慢的任务,相反,在一个任务运行比预期慢的时候,它会尽量检测,并启动另一个相同的任务作为备份。这就是所谓的任务的“推测执行”(speculative execution)。

必须认识到一点:如果同时启动两个重复的任务,它们会互相竞争,导致推测执行无法工作。这对集群资源是一种浪费。相反,调度器跟踪作业中所有相同类型(map和reduce)任务的进度,并且仅仅启动运行速度明显低于平均水平的那一小部分任务的推测副本。一个任务成功完成后,任何正在运行的重复任务都将被中止,因为已经不再需要它们了。因此,如果原任务在推测任务前完成,推测任务就会被终止;同样,如果推测任务先完成,那么原任务就会被中止。

推测执行是一种优化措施,它并不能使作业的运行更可靠。如果有一些软件缺陷会造成任务挂起或运行速度减慢,依靠推测执行来避免这些问题显然是不明智的,并且不能可靠地运行,因为相同的软件缺陷可能会影响推测式任务。应该修复软件缺陷,使任务不会挂起或运行速度减慢。

在默认情况下,推测执行是启用的。可以基于集群或基于每个作业,单独为map任务和reduce任务启用或禁用该功能。相关属性如下:

属性名称类型默认值描述
mapreduce.map.speculativebooleantrue如果任务运行变慢,该属性决定着是否要启动map任务的另外一个实例
mapreduce.reduce.speculativebooleantrue如果任务运行变慢,该属性决定着是否要启动reduce任务的另一个实例
Yarn.app.mapreduce.am.job.speculatorClassOrg.apache.hadoop.mapreduce.v2.app.speculate.DefaultSpeculatorSpeculator类实现推测执行策略(只针对MapReduce 2)
Yarn.app.mapreduce.am.job.estimator.classClassOrg.apache.hadoop.mapreduce.v2.app.speculate.LegacyTaskRuntimeEstimatorSpeculator实例使用的TaskRuntimeEstimator的实现,提供任务运行时间的估计值(只针对MapReduce 2)

为什么会想到关闭推测执行?推测执行的目的是减少作业执行时间,但这是以集群效率为代价的。在一个繁忙的集群中,推测执行会减少整体的吞吐量,因为冗余任务在执行时会减少作业的执行时间。因此,一些集群管理员倾向于在集群上关闭此选项,而让用户根据个别作业需要而开启该功能。Hadoop老版本尤其如此,因为在调度推测任务时,会过度使用推测执行方式。

对于reduce任务,关闭推测执行是有益的,因为任意重复的reduce任务都必须将取得map输出作为最先的任务,这可能会大幅度地增加集群上的网络传输。

关闭推测执行的另一种情况是为了非幂等(nonidempotent)任务。然而在很多情况下,将任务写成幂等的并使用OutputCommitter来提升任务成功时输出到最后位置的速度,这是可行的。

完毕。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值