0. Spark 代码执行的流程框架

一、代码流程步骤

整体流程图如下所示 :

步骤1:在 Spark client 机器上编写并提交我们写的 Spark 程序 application

步骤2:我们使用 spark-submit 命令提交后,该命令会以反射的方式,创建一个 Driver 进程。这个 Driver 进程执行我们编写的代码。

步骤3: 当 Driver 进程执行到我们代码中 SparkContext 初始化部分的时候,会构建一个 SparkContext 对象出来,而 SparkContext 内部,会构建 DAG SchedulerTask Scheduler .

步骤4: 被构建的时候,Task Scheduler 对象会通过自己的后台进程,去连接 Spark 集群的 Master 、并向 Master 注册我们编写的 Spark 程序 application

步骤 5:Master 接收到 Task Schedulerapplication 注册请求后,会通过自己的资源调度算法,选择并通知一些 Spark 集群的 Worker 去启动 Executor。

步骤 6:Spark 集群的 Worker 为这个 application 启动一个或多个 Executor

步骤 7:Executor 启动之后,Executor 会将自己反向注册到 Task Scheduler 上。

资源调度算法指定的所有 Executor 都注册到 Task Scheduler 后,Driver 进程就知晓了哪些 Executor 可以服务于当前的 Spark 应用程序 application。至此,Driver 进程也就完成了对 SparkContext 的初始化。

步骤 8:Driver 进程继续执行我们编写的 Spark 代码 application

步骤 9:DAG Schedulerapplication 中的每一个 Job 进行划分。

我们编写的 Spark 代码中,包含 RDD 的 Transformation 操作和 Action 操作,当 Driver 进程执行到 Action 操作时,会创建一个 Job 并把这个 Job 传给 DAG Scheduler 。之后,DAG Scheduler 会使用 Stage 划分算法,把 Job 划分为若干个 stage , 然后对每一个 stage 创建一个 TaskSet

步骤 10:DAG SchedulerTaskSet 中的每一个 Task 提交给 Task Scheduler

步骤 11:Task SchedulerTask 提交给反注册给自己的那些 Executor

这里涉及一个 Task 分配算法

步骤12:Executor 每接收到一个 Task, 都会用 TaskRunnerTask 进行封装,然后从线程池 Thread Pool 里取出一个线程 Thread,来执行这个 TaskRunner

二、Task 的执行

1. TaskRunner 拷贝我们编写的代码并反序列化,然后执行。

2. Task 分为两种, ShuffleMapTask  ResultTask。一个 Job 被划分为若干个 stage , 其中,最后一个 stage 对应的 TaskSet 中对应的 Task 属于 ResultTask,其他 stage 对应的 TaskSet 中对应的 TaskShuffleMapTask

3. 每一个 Task 针对 RDD 中的一个 Partition 来运行。这种分片执行的方式,是 Spark 可以高并发执行任务的基础。

猜你喜欢

转载自blog.csdn.net/jiangmengya1/article/details/86667870