一、代码流程步骤

整体流程图如下所示 :

spark怎么用 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 可以高并发执行任务的基础。