spark任务生成和提交流程详解

首先将代码打包上传到集群
1、Driver端会调用SparkSubmit类(内部执行submit->doRunMain->通过反射
获取应用程序的主类对象->执行主类的main方法)
2、构建sparkConf和sparkContext对象,在sparkContext入口做了三件事,创建
了sparkEnv对象(创建了ActorSystem对象)TaskScheduler(用来生成并发送
task给Executor)DAGScheduler(用来划分Stage)
3、clientActor将任务封装到ApplicationDescription对象并且提交给Master
4、Master收到任务信息后,将任务信息存到内存中,同时放到队列中(waitingApp)
5、任务信息开始执行后,调用schedule方法,进行资源的调度。
6、将调度好的资源封装到LaunchExecutor并发送给对应的worker。
7、worker接收到master发送来的任务调度信息(LaunchExecutor),将信息封装
成一个ExecutorRunner对象。
8、封装成ExecutorRunner后,调用ExecutorRunner的·start方法,开始启动GoarseGrainedExecutorBackend对象
9、Executor启动后开始向DriverActor进行反向注册。
10、与DriverActor注册成功后,创建一个线程池(TreadPool)用来执行任务
11、当所有的Executor注册完成后,意味着作业环境准备好了,Driver端会结束与
sparkContext对象的初始化。
12、当Driver初始化完成后(创建一个sc实例)会继续执行我们自己提交的App
代码,当触发了action算子时就会触发一个job,这时就会调用DAGScheduler对象
进行Stage划分。
13、DagScheduler开始进行stage划分。
14、将划分好的stage按照分区生成一个一个的task,并且封装到TaskSet对象中
然后TaskSet提交到TaskScheduler
15、TaskScheduler按照提交过来的TaskSet,拿到一个序列化器,将TaskSet序列化
,将序列化好的Task封装到LaunchExecutor并且提交到DriverActor。
16、DriverActor把LauchExcutor发送到Executro上。
17、Executor接收到DriverActor发送过来的任务(LaunchExecutro),会将其封装成为
TaskRunner,然后从线程池中获取线程来执行TaskRunner。
18、TaskRunner拿到反序列化器,反序列Taskset,然后执行App代码,也就是对
RDD分区上执行的算子和自定义函数。
ClientActor:负责和Master通信,向Master注册任务信息
DriverActor:负责和Executor进行通信,接收到    Executor反向注册和把任务发送到Executer。

sparksubmit
    执行sparksubmit类(),接收使用者传进来的任务信息
    对任务信息进行模式匹配(submit 提交任务,kill 杀死任务, requeststatus 查看任务状态)
    调用submit提交任务,再调用duRunmain类,拿到远程代理对象proxy(类似于rpc,请求远程连接)
    拿到远程代理对象proxy后重写了run()方法,通过反射拿到目标类Mainclass,通过目标类获取到main方法并执行main方法.

sparkcontext(创建入口类,也叫上下文对象)
    1.调用creatsparkEnv方法,创建sparkEnv对象(里面有个非常重要的对象ActoySystem,创建Actro())
    2.创建TaskSchuler
    3.创建DAGDchduler
    4.tashkschduler.start()
    
    调用creatsparkEnv方法创建sparkenv对象,利用Akkautils这个工具类创建了ActorSystem对象,
    通过ActorSystem创建了一个Actor,这个actor就是Executro和DriverActro的心跳信息
    
    创建TaskSchuler,根据条件任务是指定的URL(local,mesos,sparkalone模式等),创建相应的Taskschduler,
    开始和master进行(sparkalone)模式匹配,创建TaskSchulerImpl生成scheduler,创建一个sparkDeployschedulerBackend(后端调度器,任务调度)
    调用initiallize方法创建调度器(FIFO先进先出(默认),FAIR公平调度)FIFO,返回backend,scheduler.
        
    通过后端调度器(sparkDeploySchedulerBackend),调用父类的start方法创建了一个DriverActor(负责和Executor进行通信,接收Executor反向注册和把任务信息发送给Executor)
    和ClientActor(负责和Master进行通信,向Master注册任务信息)

猜你喜欢

转载自blog.csdn.net/qq_41568597/article/details/82317629