整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

6.5.2. 推测执行

hadoop 小红牛 7℃ 0评论

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

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

必须认识到一点:如果同时启动两个重复的任务,它们会互相竞争,导致推测执行无法工作。这对集群资源是一种浪费。相反,只有在一个作业的所有任务都启动之后才启动推测任务,并且只针对那些已运行一段时间(至少一分钟)且比作业中其他任务平均进度慢的任务。一个任务成功完成后, 任何正在运行的重复任务都将被中止,因为已经不再需要它们了。因此, 如果原任务在推测任务前完成,推测任务就会被终止,同样,如果推测任 务先完成,那么原任务就会被中止。

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

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

6-4.推测执行的属性

属性名称

类型

默认值

描述

mapred.map.tasks. speculative.execution

boolean

true

如果任务运行变慢,该属性决定着是否要启动map任务的另外个实例

mapred.reduce.tasks. speculative.execution

boolean

true

如果任务运行变慢,该属性决定 着是否要启动reduce任务的另外一个实例

Yarn.app.mapreduce. am.job.speculator.class

Class

Org.apache.hadoop. mapreduce.v2.app. speculate.Default Speculator

Speculator类实现推测执行策略(只针对 MapReduce2)

Yarn.app.mapreduce. am.job.estimator.class

Class

Org.apache.hadoop. mapreduce.v2.app. speculate.LegacyTaskRuntimeEstimator

Speculator实例使用的TaskRuntime Estimator的实现,提供任务运行时间的估计值只针对 MapReduce)

 

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

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

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

转载请注明:全栈大数据 » 6.5.2. 推测执行

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址