Driver相当于指挥所,SparkContext相当于是指挥所里面的指挥官,用户提交一个任务由SparkContext指挥官来进行分配和申请资源执行。
1. 首先先构建 spark Application 的运行环境,生成 SparkContext 对象。
2.SparkContext 会向资源管理器注册并申请资源。(资源管理器:YARN、Mesos、standlone 等)
3. 资源管理器收到 sparkContext 的资源请求后,会为 Executor 分配资源并启动 Executor 进程。
4. 然后,SparkContext 会根据 RDD 依赖关系,构建 DAG 图,并提交给 DAG Scheduler,DAG Scheduler 会将 DAG 图分解成一个个的 Stage,每个 Stage 中都包含若干个任务,stage 相当于任务集合。
然后,再把 Stage 提交给下一个阶段 Task Scheduler,Task Scheduler 就是负责把任务分发到具体的节点上的。
5.Task Scheduler 拿到任务后并不是立即分发出去,而是等 Worker Node 主动过来申请运行 Task,Task Scheduler 接到申请后,会将任务返回给 Worker Node,由 Worker Node 的 Executor 分配线程去运行。
(但是,这么多的 Worker Node 来申请,Task Scheduler 应该发给谁呢?原则是优先本地节点运行(计算向数据靠拢)。)
6. 最后,Executor 运行的结果会逐级返回给 Task Scheduler,再返回到 DAG Scheduler,最后返回到 SparkContext 中,做最后的处理。(处理可以返回给用户,也可以写入 HDFS 中)。
7. 最后运行完毕后,就释放资源。