Spark2.3源码分析——任务推测执行(Speculation Execute)

  |   0 评论   |   2,467 浏览

背景

在Hadoop中,当一个应用向Yarn提交应用程序后,此作业的多个任务由于负载不均衡、资源分布不均匀等原因,会导致各个任务运行时间的不一致,甚至会出现一个Task明显慢于同一作业的其它Task的情况。

为了解决这个问题,MapReduce框架提供了mapreduce.map.speculative和mapreduce.reduce.speculative参数来启用推测执行机制。

当检测的单个TaskAttempt出现异常时,将会启动一个冗余的任务来并行执行,任何一个任务先完成,就可以认为该Task完成。

Spark当中也提供了类似的机制,Pool和TaskSetManager提供了推测执行的实现

执行推测执行的操作分为两类:

  1. 可推测执行任务的检测与缓存;

  2. 从缓存中找到可推测任务进行推测执行;

具体来看

  1. Pool的checkSpeculatableTasks方法TaskSetManager#checkSpeculatableTasks()实现了按照深度遍历算法对可推断任务的检测与缓存;

  2. TaskSetManager#dequeueSpeculativeTask实现了从缓存中找到可推断任务进行推测执行;

可推测执行任务的检测与缓存

speculationScheduler的启动

speculationScheduler定义在TaskSchedulerImpl当中,随着TaskSchedulerImpl的启动而启动,定期执行推测任务线程

org.apache.spark.scheduler.TaskSchedulerImpl#start

image.png

检查所有Active Job中是否有可推测的任务

org.apache.spark.scheduler.TaskSchedulerImpl#checkSpeculatableTasks

image.png

Pool

Pool中实现了TaskSetManager的存储及入队、出队操作

image.png

通过Pool#checkSpeculatableTasks可以检查是否有需要推测式执行的tasks

image.png

TaskSetManager#checkSpeculatableTasks

Schedulable的实现类是org.apache.spark.scheduler.TaskSetManager

通过计算,如果有需要推测执行的Task,则放入speculatableTasks集合中进行缓存,等待有资源时进行调度

org.apache.spark.scheduler.TaskSetManager#checkSpeculatableTasks

image.png

从缓存中找到可推断任务进行推测执行

推测执行

在《Spark2.3源码分析——TaskScheduler的实现》中我们提到,申请到资源后,在org.apache.spark.scheduler.TaskSetManager#dequeueTask方法的最后阶段,会进行推测执行任务

image.png

TaskSetManager#dequeueSpeculativeTask

检测给定的executor是否有可用的可推测任务,有以下判断条件:

  1. 如果主机速度较慢,任务不应该在该主机上运行

  2. 任务应该满足给定的本地性约束

该方法会从speculatableTasks集合中取出处理的Task

org.apache.spark.scheduler.TaskSetManager#dequeueSpeculativeTask

image.png

image.png

image.png

image.png



读后有收获可以支付宝请作者喝咖啡