ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
**1. DAG的生成** 根据RDD之间的依赖关系,生成一个DAG(有向无环图)。 :-: ![](https://img.kancloud.cn/2e/f6/2ef6c26ab6f2996c4d236f58c2b93ca1_896x403.png) DAG生成 <br/> **2. Stage的划分** DAGScheduler 将DAG划分为多个Stage。 * 划分依据:是否发生宽依赖(Shuffle),发生宽依赖则划分一个Stage。 * 划分规则:从后往前,遇到宽依赖切割为新的Stage。 * 每个Stage由一组并行的Task组成。 :-: ![](https://img.kancloud.cn/cb/5b/cb5bc7b9a9810e776ef397a567b0832f_1151x447.png) DAG阶段划分 <br/> **3. 任务调度** 任务调度分两个主要模块:DAGScheduler 和 TaskScheduler。它们负责将用户提交的计算任务按照 DAG 划分为不同的阶段并且将不同阶段的计算任务提交到集群进行最终的计算。 :-: ![](https://img.kancloud.cn/4d/23/4d233cf4a401f2301ebb1980378776b4_1271x371.png) 任务调度逻辑图 具体涉及三个主要类: * DAGScheduler:负责分析用户提交的应用,并根据计算任务的依赖关系建立 DAG,且将 DAG 划分为不同的 Stage,每个 Stage 可并发执行一组 Task。 * TaskScheduler:DAGScheduler 将划分完成的 Task(一组任务 TaskSet)提交到 TaskScheduler,TaskScheduler 通过 Cluster Manager 在集群中的某个Worker 的 Executor 上启动任务。 * SchedulerBackend:每个 TaskScheduler 对应一个 SchedulerBackend,作用是分配当前可用的资源,具体就是向当前等待分配计算资源的 Task 分配计算资源(Executor),并在分配的 Executor 上启动 Task,完成计算的调度过程。<br/> Spark 中的任务分为两种:ShuffleMapTask 与 ResultTask。 * ShuffleMapTask:任务所在 Stage 不是最后一个 Stage,即 ShuffleMapState。对于非最后的 Stage,会根据每个 Stage 的分区数量来生成 ShuffleMapTask。ShuffleMapTask 会根据下游 Task 的分区数量和 Shuffle 策略来生成一系列文件。 * ResultTask:任务所在 Stage 是最后一个 Stage,即 ResultStage。对于最后一个Stage,会根据生成结果的分区来生成与分区数量相同的 ResultTask,然后ResultTask 将计算结果汇报到 Driver 端。