spark学习-51-Spark的task任务的运行

来源:互联网 发布:淘宝上的电动车怎么样 编辑:程序博客网 时间:2024/06/07 05:30

1。看完Spark的job调度http://blog.csdn.net/qq_21383435/article/details/78700430后再来看这个

2。在DAGScheduler.scala中,最后调用

// TODO:最后所有的Stage都转换为TaskSet任务集去提交,最后开始执行任务      // 这里调用的是TaskScheduler的接口方法submitTasks()提交一系列要运行的任务。所以要看其实现类TaskSchedulerImpl。      // 调用了里面的方法submitTasks      taskScheduler.submitTasks(new TaskSet(        tasks.toArray, stage.id, stage.latestInfo.attemptId, jobId, properties))

提交任务,该任务这里调用的是TaskScheduler的接口方法submitTasks()提交一系列要运行的任务。所以要看其实现类TaskSchedulerImpl。调用了里面的方法submitTasks

先看一下整体流程
这里写图片描述

然后看看该方法

 /**    *   submitTasks位于TaskSchedulerImpl:    *   submitTasks主要分为以下几个步骤:    *     1.构建任务集管理器。既将TaskScheduler,TaskSet及最大失败次数(maxTaskFailures)封装为TaskSetManager.    *     2.设置任务集调度策略(调度模式有FAIR和FIFO两种,此处默认为FIFO为例)。将TaskSetManager添加到FIFOSchedulable中。    *     3.资源分配。调用LocalBackend的reviveOffers方法,实际向localActor发送ReviveOffers消息。localActor对ReviveOffers消息的匹配    *       执行reviveOffers方法。    */  override def submitTasks(taskSet: TaskSet) {    val tasks = taskSet.tasks    logInfo("Adding task set " + taskSet.id + " with " + tasks.length + " tasks")    this.synchronized {      // 生成一个TaskSetManager类型对象,      // task最大重试次数,由参数spark.task.maxFailures设置,默认为4      val manager = createTaskSetManager(taskSet, maxTaskFailures)      val stage = taskSet.stageId      // key为stageId,value为一个HashMap,这个HashMap中的key为stageAttemptId,value为TaskSetManager对象      val stageTaskSets =        taskSetsByStageIdAndAttempt.getOrElseUpdate(stage, new HashMap[Int, TaskSetManager])      stageTaskSets(taskSet.stageAttemptId) = manager      // 如果当前这个stageId对应的HashMap[Int, TaskSetManager]中存在某个taskSet      // 使得当前的taskSet和这个taskSet不是同一个,并且当前这个TaskSetManager不是zombie进程      // 即对于同一个stageId,如果当前这个TaskSetManager不是zombie进程,即其中的tasks需要运行,      // 并且对当前stageId,有两个不同的taskSet在运行      // 那么就应该抛出异常,确保同一个Stage在正常运行情况下不能有两个taskSet在运行      val conflictingTaskSet = stageTaskSets.exists { case (_, ts) =>        ts.taskSet != taskSet && !ts.isZombie      }      if (conflictingTaskSet) {        throw new IllegalStateException(s"more than one active taskSet for stage $stage:" +          s" ${stageTaskSets.toSeq.map{_._2.taskSet.id}.mkString(",")}")      }      //添加到资源池,task的调度下一节讲解      // 根据调度模式生成FIFOSchedulableBuilder或者FairSchedulableBuilder,将当前的TaskSetManager提交到调度池中      schedulableBuilder.addTaskSetManager(manager, manager.taskSet.properties)      if (!isLocal && !hasReceivedTask) {        starvationTimer.scheduleAtFixedRate(new TimerTask() {          override def run() {            if (!hasLaunchedTask) {              logWarning("Initial job has not accepted any resources; " +                "check your cluster UI to ensure that workers are registered " +                "and have sufficient resources")            } else {              this.cancel()            }          }        }, STARVATION_TIMEOUT_MS, STARVATION_TIMEOUT_MS)      }      hasReceivedTask = true    }    //通过CoarseGrainedSchedulerBackend将task发往各个work节点的CoarseGrainedExecutorBackend进程    // 向schedulerBackend申请资源    backend.reviveOffers()  }
原创粉丝点击