概述
? ?
之前我们提到: Driver 的 sc 负责和 Executor 交互, 完成任务的分配和调度, 在底层, 任务调度模块主要包含两大部分:
- )DAGScheduler
- )TaskScheduler
它们负责将用户提交的计算任务按照 DAG 划分为不同的阶段并且将不同阶段的计算任务提交到集群进行最终的计算. 整个过程可以使用下图表示
? ?
? ?
RDD?Objects 可以理解为用户实际代码中创建的 RDD, 这些代码逻辑上组成了一个 DAG.
? ?
DAGScheduler 主要负责分析依赖关系, 然后将 DAG 划分为不同的 Stage(阶段), 其中每个 Stage 由可以并发执行的一组 Task 构成, 这些 Task 的执行逻辑完全相同, 只是作用于不同的数据.
? ?
在 DAGScheduler 将这组 Task 划分完成后, 会将这组 Task 提交到 TaskScheduler.TaskScheduler 通过 Cluster?Manager 申请计算资源, 比如在集群中的某个 Worker Node 上启动专属的 Executor, 并分配 CPU, 内存等资源. 接下来, 就是在 Executor 中运行 Task 任务, 如果缓存中没有计算结果, 那么就需要开始计算, 同时, 计算的结果会回传到 Driver 或者保存在本地.
? ?
? ?
Scheduler 的实现概述
任务调度模块涉及的最重要的三个类是:
1)org.apache.spark.scheduler.DAGScheduler 前面提到的 DAGScheduler 的实现.
将一个 DAG 划分为一个一个的 Stage 阶段 (每个 Stage 是一组 Task 的集合)
然后把 Task Set 交给 TaskScheduler 模块.
2)org.apache.spark.scheduler.TaskScheduler
它的作用是为创建它的 SparkContext 调度任务, 即从 DAGScheduler 接收不同 Stage 的任务. 向 Cluster Manager 申请资源. 然后 Cluster Manager 收到资源请求之后, 在 Worker 为其启动进程
3)org.apache.spark.scheduler.SchedulerBackend
是一个 trait, 作用是分配当前可用的资源, 具体就是向当前等待分配计算资源的 Task 分配计算资源 (即 Executor), 并且在分配的 Executor 上启动 Task, 完成计算的调度过程.
4)AKKA 是一个网络通信框架, 类似于 Netty, 此框架在 Spark1.8 之后已全部替换成 Netty
? ?
任务调度流程图
? ?
??
来源: http://www.bubuko.com/infodetail-3102500.html