zoukankan      html  css  js  c++  java
  • 大话Spark(9)-源码之TaskScheduler

    上篇文章讲到DAGScheduler会把job划分为多个Stage,每个Stage中都会创建一批Task,然后把Task封装为TaskSet提交到TaskScheduler。
    这里我们来一起看下TaskScheduler是如何把Task分配到应用程序的Executor上去执行。
    重点是这里的task分配算法。

    如下图是DagScheduler中把TaskSet提交到TaskScheduler:
    这里我们以standalone模式为例,使用的是TaskSchedulerImpl,实现与TaskSchduler这个trait

    TaskSchedulerImple的submitTasks方法如下:
    首先它会为每个taskSet创建一个TaskManager,TaskManager负责管理这个TaskSet(负责Task的重试,处理TaskSet的本地话调度机制等)。

    上图中重要的方法是backend.reviveOffers(),这里的backend是初始化SparkContext的时候根据clusterManager的不同创建的backend(这里是 StandaloneSchedulerBackend extends CoarseGrainedSchedulerBackend),backend底层负责底层接受TaskSchedulerImpl的控制,负责Master的注册和Tasks发送到Executor等操作。

    backend.reviveOffers()调用到CoarseGrainedSchedulerBackend的内部类DriverEndpoint的makeOffers, 如下:

    makeOffers方法的主要作用是取出所有可用的executor并且计算其可用的资源数量,然后调用resourceOffers把task分配到executor,以下是resourceOffers中的部分代码:

    按照我们的调度顺序获取每个TaskSet, 然后级别的递增顺序遍历本地化级别, 尝试使用最小的本地化级别启动task

    本地化级别:
    1 PROCESS_LOCAL:进程本地化,rdd对应的分区数据和task在一个executor中,速度最快
    2 NODE_LOCAL: 节点本地化,rdd和task不在一个executor中,但是在一个worker上
    3 NO_PREF: 无所谓本地化级别
    4 RACK_LOCAL:机架本地化, rdd和task在一个机架上。
    5 ANY: 任意的本地化级别。
    启动任务的时候从最小的本地化级别开始尝试,也就是尽量选择最快的计算方式。

    再看一下上图中,内层for循环中的resourceOfferSingleTaskSet方法:

    以上就是TaskScheduler执行task分配算法的大致过程,感谢阅读。

    原文链接:

     

    大话Spark(9)-源码之TaskScheduler

     

  • 相关阅读:
    反编译
    字符编码集格式
    BZOJ 1032 [JSOI2007]祖码Zuma
    2015-7-21 模板练习
    2015-7-20 模板练习
    BZOJ 1028 [JSOI2007]麻将
    BZOJ 1027 [JSOI2007]合金
    BZOJ 1026 [SCOI2009]windy数
    BZOJ 1025 [SCOI2009]游戏
    COJ 2024 仙境传奇(五)——一个天才的觉醒 素数筛
  • 原文地址:https://www.cnblogs.com/wangtcc/p/da-huaSpark-9yuan-ma-zhiTaskScheduler.html
Copyright © 2011-2022 走看看