4.1 Spark 任务调度概述
当 Driver
起来后,Driver
则会根据用户程序逻辑准备任务,并根据Executor
资源情况逐步分发任务。
在详细阐述任务调度前,首先说明下 Spark 里的几个概念。一个 Spark 应用程序包括Job
、Stage
以及Task
三个概念:
Job 是以
Action
算子为界,遇到一个Action
算子则触发一个Job
;Stage 是 Job 的子集,以 RDD 宽依赖(即 Shuffle )为界,遇到 Shuffle 做一次划分;
Task 是 Stage 的子集,以并行度(分区数)来衡量,这个 Stage 分区数是多少,则这个Stage 就有多少个 Task。
Spark RDD
通过其 Transactions
操作,形成了RDD
血缘关系图,即DAG
,最后通过Action
的调用,触发Job
并调度执行。
DAGScheduler
负责Stage
级的调度,主要是将job
切分成若干Stages
,并将每个Stage
打包成TaskSet
交给TaskScheduler
调度。
TaskScheduler
负责Task
级的调度,将DAGScheduler
传过来的TaskSet
按照指定的调度策略分发到Executor
上执行,调度过程中SchedulerBackend
负责提供可用资源,其中SchedulerBackend
有多种实现,分别对接不同的资源管理系统。
Driver
初始化SparkContext
过程中,会分别初始化DAGScheduler
、TaskScheduler
、SchedulerBackend
以及HeartbeatReceiver
,并启动 SchedulerBackend
以及HeartbeatReceiver
。
SchedulerBackend
通过ApplicationMaster
申请资源,并不断从TaskScheduler
中拿到合适的Task
分发到Executor
执行。
HeartbeatReceiver
负责接收Executor
的心跳信息,监控Executor
的存活状况,并通知到TaskScheduler
。