Spark提交流程

在这里插入图片描述

① 打包程序为 `xxx.jar`,上传到某个节点上
② 执行一个 `SparkSubmit` ,在SparkSubmit中,会写各种配置信息(--master、CPU、内存)

③ 以 `client` 模式为例,会在提交的节点上启动一个 driver进程

④ Driver就是我们的 `application`,Wordcount

⑤ 创建 `SparkContext` 对象,会在内部创建(`DAGscheduler`,`Taskscheduler`)

⑥ 在driver中,代码如果遇到了 `action` 算子,就会创建一个 job(即Spark程序中有多少个action,就会产生多少个job)

⑦ `DAGscheduler` 会接收 job,为job生成DAG(有向无环图)

⑧ 把DAG划分为 Stage

⑨ 把 Stage 里面的 task 切分出来,生成 taskSet

⑩ 接收taskSet后调度task

⑪ taskScheduler里面会有一个后台进程,去专门连接 Master,向Master注册(申请资源,如CPU,内存、磁盘)

⑫ master 接收到 driver 端的注册

⑬ 结合需要的资源和本身空闲的资源,利用资源调度算法来决定在哪些worker上运行我们的这个application。

⑭ master通知 worker 启动 executor(worker中包含有 executor、线程池、taskRunner)

⑮ worker 启动 executor(executor使用资源CPU+内存)

⑯ executor 反向注册 driver 里面的 taskScheduler

⑰ driver中的 taskScheduler 接收到 executor 的反向注册,把 taskSet中的task发送到 executor

⑱ worker中的 taskRunner(执行task)接收到一个序列化文件,先反序列化拷贝等,生成task,task里面有 rdd 的执行算子和一些方法需要的常量。executor 接收到很多的task,每接收到一个 task都会从线程池里面获取一个线程,用taskRunner来执行task。

⑲ task分为 shuffleMapTask和resultTask,最后一个stage对一个的task就是resultTask,之前所有的stage对应的task都是shuffleMapTask。如果spark程序执行的是 shuffleMapTask,那么程序在执行完这个stage之后,还需要继续执行下一个 stage

⑳ spark程序,就是stage被切分为很多 task,封装到 taskSet 里面,提交给 executor执行,一个stage一个stage执行,每个task对应一个rdd的Partition(分区),这个task执行的就是我们写的算子操作,最后知道最后一个stage执行完。

猜你喜欢

转载自blog.csdn.net/Poolweet_/article/details/108472307