Spark任务调度原理解析

1.调用SparkSubmit类 执行submit方法 -->doRunmain--> RunMain-->通过反射机制创建我们的主类对象--》再拿到主类的main方法--》执行主类的main方法
2.开始构造sparkConf对象和sparkContext对象 作为提交任务的入口类,在sparkContext入口类里会做三件事,
创建了SparkEnv对象(创建了ActorSystem对象),
创建了DAGSchedular(进行Stage划分)
以及taskSchedular(用来生成和发送task的),
TaskSchedular 有两个Actor
ClientActor 负责和Master通信 作用向Master注册应用
DriverActor 负责和Executor通信 作用用来接收executor反向注册和把任务提交到executor
3、ClientActor将我们提交任务的参数封装到ApplicationDescription 对象里提交到Master上、
4、Master 接收到ClientActor提交的任务信息先存放到内存中,然后放到任务队列中(waitingApps变量)
5、当开始执行这个任务信息时,调用Scheduler方法进行资源的调度(资源改变的时候都调度)
6、将调度好的资源分装成LaunchExecutor 并且发送给对应的Worker
7、worker接收到Master发送的调度信息 LaunchExecutor,会将信息封装成ExecutorRunner
8、封装成ExecutorRunner后,调用ExecutorRunner.start()方法启动 CoraseGraindExecutorBankend对象 他就是Executor
作用:执行DriverActor发送过来的任务
9、Executor启动后向DriverActor进行注册
10、注册完成后创建一个线程池(ThreadPool)
11、当所有的Executor注册完成后 意味着运行我们作业的环境 已经准备好了,Driver会结束SparkContext对象的初始化

任务调度:

12、当Driver初始化完成后(创建了一个SC实例),会继续执行我们编写的代码,当触发了Action的RDD算子时,就意味着出拉分了一个job,此事就会调用一个DAGScheduler进行Stage的划分
13、DAGScheduler开始进行Stage划分
14、将划分好的Stage按照分区数生成一个一个的task封装到taskSet对象,然后TaskSet提交该TaskScheduler
15、TaskScheduler接收到提交过来的TaskSet时,会拿到一个序列化器,对TaskSet进行序列化,
之后将序列化好的TaskSet封装成LaunchExecutor
16、发送LanchExecutor到Executor上执行任务
17、Executor接收到DriverActor发送过来的LaunchExecutor时,会将其封装成TaskRunner,然后从线程池中获取线程并执行TaskRunner
TaskRunner
18、TaskRunner拿到反序列化器,反序列化TaskSet,然后执行我们编写的代码,也就是对RDD分区上的数据进行 map filter sortBy
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值