一图看懂Spark任务提交全流程
Posted DLab数据实验室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一图看懂Spark任务提交全流程相关的知识,希望对你有一定的参考价值。
我们平时写完了Spark程序,打包提交,然后就等着Spark引擎返回结果给我们,但是当我们提交任务之后,Spark需要进行一系列的初始化和调度才能真正开始任务的执行,下面通过一幅图来看看Spark任务提交后都做了哪些工作。
首先从大的流程上看一下经过了哪几个步骤。
1.Driver端启动SparkSubmit进程,启动后开始向Master进行通信,此时创建了一个对象(SparkContext),接着向Master发送任务消息
2.Master接收到任务信息后,开始资源调度,此时会和所有的Worker进行通信,找到空闲的Worker,并通知Worker来拿取任务和启动相应的Executor
3.Executor启动后,开始与Driver进行反向注册,接下来Driver开始把任务发送给相应的Executor,Executor开始计算任务
1.调用SparkSubmit类,内部执行submit --> doRunMain -> 通过反射获取应用程序的主类对象 --> 执行主类的main方法。
2.构建SparkConf和SparkContext对象,在SparkContext入口做了三件事,创建了SparkEnv对象(创建了ActorSystem对象),TaskScheduler(用来生成并发送task给Executor),DAGScheduler(用来划分Stage)。
3.ClientActor将任务信息封装到ApplicationDescription对象里并且提交给Master。
4.Master收到ClientActor提交的任务信息后,把任务信息存在内存中,然后又将任务信息放到队列中。
5.当开始执行这个任务信息的时候,调用scheduler方法,进行资源的调度。
6.将调度好的资源封装到LaunchExecutor并发送给对应的Worker。
7.Worker接收到Master发送过来的调度信息(LaunchExecutor)后,将信息封装成一个ExecutorRunner对象。
8.封装成ExecutorRunner后,调用ExecutorRunner的start方法,开始启动 CoarseGrainedExecutorBackend对象。
9.Executor启动后向DriverActor进行反向注册。
10.与DriverActor注册成功后,创建一个线程池(ThreadPool),用来执行任务。
11.当所有的Executor注册完成后,意味着作业环境准备好了,Driver端会结束与SparkContext对象的初始化。
12.当Driver初始化完成后(创建了sc实例),会继续执行我们提交的App的代码,当触发了Action的RDD算子时,就触发了一个job,这时就会调用DAGScheduler对象进行Stage划分。
13.DAGScheduler开始进行Stage划分。
14.将划分好的Stage按照区域生成一个一个的task,并且封装到TaskSet对象,然后TaskSet提交到TaskScheduler。
15.TaskScheduler接收到提交过来的TaskSet,拿到一个序列化器,对TaskSet序列化,将序列化好的TaskSet封装到LaunchExecutor并提交到DriverActor。
16.把LaunchExecutor发送到Executor上。
17.Executor接收到DriverActor发送过来的任务(LaunchExecutor),会将其封装成TaskRunner,然后从线程池中获取线程来执行TaskRunner。
18.TaskRunner拿到反序列化器,反序列化TaskSet,然后执行App代码,也就是对RDD分区上执行的算子和自定义函数。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/qq_37332702/article/details/88687251
以上是关于一图看懂Spark任务提交全流程的主要内容,如果未能解决你的问题,请参考以下文章
一图看懂Spring Boot 异步框架
一图看懂 bz2 模块:处理压缩和解压缩文件, 资料整理+笔记(大全)
Runtime objc4-779.1 一图看懂iOS Runtime消息转发
一图看懂,阿里云飞天企业版如何支持政企数智创新
Runtime objc4-779.1 一图看懂iOS Runtime消息转发
一图看懂mybatis执行过程