spark 内核源码深度剖析
问题:怎么划分stage,stage之间是怎么调度的,为什么1,3并行,4,7并行
内核架构剖析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dOHo6AUL-1629550583239)(./1626525185981.png)]
- 提交一个job,启动一个drive进程。
- 先构造SparkConf再构造SparkContext
- 在sparkContext时,先构造出来DAGScheduler和TaskScheduler。DAGScheduler负责创建job,Application在遇到action操作时,才会真正的提交任务并进行计算。这时spark会根据action操作之前的Transform操作的关联关系,生成一个DAG,将DAG中的RDD划分到不同的stage,提交stage等,。
- TaskScheduler负责用调度算法,对集群管理器已经分配给应用程序的资源进行二次调度后分配给任务,TaskScheduler调度的Task是由DAGScheduler创建的,所以DAGScheduler是TaskScheduler的前置调度。TaskScheduler在初始化时,通过对应的后台进程,连接master,向master注册application
- master接收到application注册的请求后,会使用自己的资源调度算法,在spark集群的worker上,为这个application启动多个execution
- worker会为application启动executor进程。
- executor启动之后会反向注册到TaskScheduler
- 每执行一个action就会创建一个job,提交给DAGScheduler。DAGScheduler会将job划分为多个stage(stage划分算法),然后每个stage创建一个taskSet。taskScheduler会把taskset里每个task提交到executor(分配算法)
- executor每接收到一个task都会用taskrunner来封装task,然后从线程池中取出一个线程,执行这个task。
- taskrunner将代码中的算子和函数拷贝、反序列化,然后执行task。
- task有两种,一中是shufflemapTask和resulttask,只有最后一个task是resulttask,其余都是shuffleMapTask
- 最后整个spark应用程序的执行就是stage分批次作为taskset提交到executor执行,每个task针对rdd的一个partiiton,执行我们定义的算子和函数。
一级调度:给application分配并运行executor 二级调度:给任务分配executor并运行任务
参考资料: 【Spark 内核】 Spark 内核解析-上
不论Spark以何种模式进行部署,任务提交后,都会先启动Driver进程,随后Driver进程向集群管理器注册应用程序,之后集群管理器根据此任务的配置文件分配Executor并启动,当Driver所需的资源全部满足后,Driver开始执行main函数,Spark查询为懒执行,当执行到action算子时开始反向推算,根据宽依赖进行stage的划分,随后每一个stage对应一个taskset,taskset中有多个task,根据本地化原则,task会被分发到指定的Executor去执行,在任务执行的过程中,Executor也会不断与Driver进行通信,报告任务运行情况。
|