Spark架构及运行机制(6) - Task调度

    DAGScheduler将建立好的TaskSet提交给TaskScheduler之后,DAGScheduler对任务的调度工作就算完成了。DAGScheduler只是完成了将作业的有向无环图分割为Stage,并生成了一个Stage执行的有序计算序列。而TaskScheduler真正决定了Stage中的每个Task由哪个物理节点执行。有向无环图、DAGScheduler、TaskScheduler之间的关系图如下:


    TaskScheduler会为每个TaskSet创建一个TaskSetManager,由TaskSetManager负责TaskSet中Task的管理调度工作,但是TaskSetManager不是直接与底层的物理节点通信,而是通过TaskScheduler来协调每个TaskSetManager与底层物理节点的交互。

    1)TaskScheduler会通过SchedulerBackend与底层的Master、Worker节点进行通信;SchedulerBackend是调度器的后台进程;TaskScheduler会根据不同的部署方式选择不同的SchedulerBackend,SchedulerBackend可以使用YARN、Mesos、Standalone等多种形式;
    2)TaskScheduler会将可用的物理资源提供给TaskSetManager,由TaskSetManager确定每个Task在哪个物理资源上执行,并将调度计划发给TaskScheduler,由TaskScheduler将Task提交给Spark集群实际执行;

    TaskScheduler将Task提交给Spark后,会跟踪Task的执行情况,如果Task提交失败,它会负责尝试重新提交。同一个TaskSet中的多个Task是并行执行的,如果被分配到某个物理节点上的Task长时间未完成,拖延了整个TaskSet的执行时间,TaskScheduler会选择一个新的物理节点执行该Task。

    TaskSetManager的调度策略是基于位置感知的任务调度。TaskSetManager会根据可用资源的情况尽量为每个Task选择最佳本地化(Locality)的Executor进行匹配。也就是说,Spark会首先判断同一个Stage中的首个RDD各个分区的位置,每个Task是对一个分区的一串操作,Spark会尽量将对一个分区的Task操作保持在同一个地点。最理想的将同一个Task的前后操作放在同一个进程中,如果条件不满足,则退而求在同一个计算节点中,如果还不能满足,退而求在再同一个机架运行。最终TaskSetManager选择一个最为合适运行的计算资源,将该资源的申请提交给TaskScheduler。
 
    一个应用程序最终会拆分为多个TaskSet任务集,由于有的TaskSet之间没有依赖关系,因此在同一时间可能会存在多个可运行的TaskSet交给TaskScheduler进行调度。这种情况,Spark可采用2中调度模式:FIFO和FAIR。
   
     FIFO:先进先出的调度模式,是Spark默认的调度模式。
    
     FAIR:公平调度模式。在FAIR模式下,每个计算任务具有相等的优先级,Spark以轮询的方式为每个任务分配计算资源。FAIR模式为用户提供了一个调度池的概念,用户可以将重要的计算任务放入一个调度池中,通过设置该调度池的权重来使调度池中的人物获得较高的优先级。除此之外,当多个用户同时使用Spark集群时,FAIR模式为每个用户设置一个调度池,调度池具有相同的优先级,保证每个用户可以平等得使用Spark计算资源。

猜你喜欢

转载自margaret0071.iteye.com/blog/2387553