TaskScheduler分配算法和源码

本文深入分析了Spark的TaskSchedulerImpl在standalone模式下的任务调度过程。从DAGScheduler提交TaskSet开始,探讨TaskSchedulerImpl的submitTasks方法作为任务提交入口,然后详细阐述了如何通过resourceOffers方法执行任务分配算法,将任务分配到Executor上,并通过launchTasks方法发送LaunchTask消息给Executor,最终启动并执行任务。整个流程涉及StandaloneSchedulerBackend、CoarseGrainedSchedulerBackend和Executor资源管理。
摘要由CSDN通过智能技术生成

TaskScheduler是一个trait,这里以standalone模式下的TaskSchedulerImpl来分析。

上面文章最后说,DAGScheduler把stage中的task封装成TaskSet,调用TaskSchedulerImpl的submitTasks方法。

我们就从这个方法着手来分析TaskSchedulerImpl,这个方法可以理解为提交任务的入口。

override def submitTasks(taskSet: TaskSet) {
  val tasks = taskSet.tasks
  logInfo("Adding task set " + taskSet.id + " with " + tasks.length + " tasks")
  this.synchronized {
    //给每个taskSet都会创建一个TaskSetManager(在后面会负责它的那个taskSet的任务执行状况的监视和管理。在TaskSchedulerImpl
    中,对一个单独的TaskSet任务进行调度。这个类负责追踪每一个task,如果task失败的话,会负责重试task,直到超过重试的次数限制
    并且会通过延迟调度,为这个TaskSet处理本地化调度机制。他的主要接口是resourceOffer,在这个接口中,TaskSet会希望在一个节点
    上运行一个任务,并且接受任务的状态改变消息,来直到它负责的task的状态改变了。)
    val manager = createTaskSetManager(taskSet, maxTaskFailures)
    val stage = taskSet.stageId
    val stageTaskSets =
      taskSetsByStageIdAndAttempt.getOrElseUpdate(stage, new HashMap[Int, TaskSetManager])
    //加入内存缓存
    stageTaskSets(taskSet.stageAttemptId) = manager
    val conflictingTaskSet = stageTaskSets.exists { case (_, ts) =>
      ts.taskSet != taskSet && !ts.isZombie
    }
    if (conflictingTaskSet) {
      throw new IllegalStateException(s"more than one active taskSet for stage $
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值