Spark调度系统——任务调度器TaskScheduler

本文详细解析了Spark的TaskScheduler模块,介绍了TaskSchedulerImpl作为唯一实现,如何接收DAGScheduler的任务集,按照调度算法分配资源,处理任务执行与重试,以及通过推断执行策略优化落后任务。

任务调度器TaskScheduler定义了对任务进行调度的接口规范,允许向Spark调度系统插入不同的TaskScheduler实现,但目前只有TaskSchedulerImpl这一个具体实现。TaskScheduler只为单个Driver调度任务。TaskSchedulerImpl的功能包括接收DAGScheduler给每个Stage创建的Task集合,按照调度算法将资源分配给Task,将Task交给Spark集群不同节点上的Executor运行,在这些Task执行失败时进行重试,通过推断执行减轻落后的Task对整体作业进度的影响。

Spark的资源调度为分两层:

  • 第一层是ClusterManager(在YARN模式下为ResourceManager,在Mesos模式下为MesosMaster,在Standalone模式下为Master)将资源分配给Application
  • 第二层是Application进一步将资源分配给Application的各个Task。TaskSchedulerImpl中的资源调度就是第二层的资源调度

1 TaskSchedulerImpl的属性

  • maxTaskFailure:任务失败的最大次数
  • isLocal:是否是Local部署模式
  • SPECULATION_INTERVAL_MS:任务推断执行的时间间隔。可以通过spark.speculation.interval属性进行配置,默认为100ms
  • MIN_TIME_TO_SPECULATION:用于保证原始任务至少需要运行的时间。
  • taskResultGetter:类型为TaskResultGetter,它的作用是通过线程池(此线程池由Executors.newFixedThreadPool创建,大小默认为4,生成的线程名以task-result-getter开关),对Slave发送的Task的执行结果进行处理

2 TaskSchedulerImpl的初始化

用于对TaskSchedulerImpl进行初始化

//org.apache.spark.scheduler.TaskSchedulerImpl
def initialize(backend: SchedulerBackend) {
  this.backend = backend
  rootPool = new Pool("", schedulingMode, 0, 0)
  schedulableBuilder = {
    schedulingMode match {
      case SchedulingMode.FIFO =>
        new FIFOSchedulableBuilder(rootPool)
      case SchedulingMode.FAIR =>
        new FairSchedulableBuilder(rootPool, conf)
      case _ =>
        throw new IllegalArgumentException(s"Unsupported spark.scheduler.mode: $schedulingMode")
    }
  }
  schedulableBuilder.buildPools()
}
  • 1)使用参数传递的SchedulerBackend设置TaskSchedulerImpl的backend属性
  • 2)创建根调度池
  • 3)根据调度模式,创建相应的调度池构建器。
  • 4)调用调度池构建器buildPools方法构建调度池

3 TaskSchedulerImpl的启动

启动任务调度器是通过其start方法实现的。TaskSchedulerImpl的start方法的实现如下:

override def start() {
  backend.start()
  if (!isLocal && conf.getBoolean("spark.speculation", false)) {
    logInfo("Starting speculative execution thread")
    speculationScheduler.scheduleAtFixedRate(new Runnable {
      override def run(): Unit = Utils.tryOrStopSparkContext(sc) {
        checkSpeculatableTasks()
      }
    }, SPECULATION_INTERVAL_MS, SPECULATION_INTERVAL_MS, TimeUnit.MILLISECONDS)
  }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值