当前位置:网站首页>spark源码-任务提交流程之-7-流程梳理总结
spark源码-任务提交流程之-7-流程梳理总结
2022-08-05 05:18:00 【zdaiqing】
spark-submit执行流程梳理
1.概述
本阶段都是基于spark-on-yarn-cluster模式进行梳理分析;
在前面的分析过程中,顺着spark-submit提交后,代码的执行顺序从前向后阶段性的进行了分析(详见参考资料);
接下来将基于前期的分析进行梳理总结;
2.启动sparkSubmit进程
在sparkSubmit进程中:
1、调用SparkSubmitArguments对提交参数进行解析、校验、封装;
2、根据提交参数判断任务提交类型,针对spark-submit任务,走任务提交流程;
3、准备任务提交环境(jar包路径、spark集群应用类-org.apache.spark.deploy.yarn.YarnClusterApplication)、加载外部jar包;
4、根据spark集群应用类YarnClusterApplication实例化应用对象app,并调用应用对象app.start()方法启动应用;
5、由spark集群应用app构造客户端参数对象clientArguments封装客户端参数,然后启动客户端client;
6、客户端client中初始化和启动yarnClient;
7、由Client#verifyClusterResources()验证集群资源、Client#createContainerLaunchContext()封装命令,Client#createApplicationSubmissionContext()设置启动AM的上下文;
8、client调用yarnClient#submitApplication()提交应用到RM启动AM;
注意:
在由client调动Client#createContainerLaunchContext()方法设置启动AM的上下文过程中,会封装启动AM的命令,其中针对yarn-cluster模式,会封装通过/bin/java启动org.apache.spark.deploy.yarn.ApplicationMaster进程的命令;
RM选择NN根据这下命令启动AM;
3.启动ApplicationMaster进程
在AM进程中:
1、根据反射获取用户类main方法,然后实例化并启动一个driver线程,由driver线程通过反射调用用户类main方法;
2、AM向yarn的RM注册;
3、AM向RM申请资源;
4、AM轮询从RM获取的资源列表(containers),开启新线程由线程池执行;在线程中向资源NN发送指令启动ExecutorBackend进程;
注意:
driver线程是AM进程的一个线程;
driver线程负责执行用户类main方法;
在申请资源时,会构建分配器,由分配器负责资源申请与向资源发送指令;
在构建分配器后,申请资源前,会将AM节点通过rpcEnv注册到消息分发器中;
4.启动CoarseGrainedExecutorBackend进程
CoarseGrainedExecutorBackend中任务执行流程:
rpc消息通信流程:
在CoarseGrainedExecutorBackend进程中:
1、获取rpcEnv对象:
在rpcEnv对象中,维护了一个消息分发器dispatcher对象;
dispatcher对象中维护了一个线程池,线程池中线程从阻塞队列中获取收件节点,处理收件节点的收件箱中消息—>调用收件节点与消息类型对应的处理方法处理消息;
2、向rpcEnv中注册Executor节点(CoarseGrainedExecutorBackend对象):
节点缓存在消息分发器缓存器中后,回向executor节点的收件箱中添加一条Onstart消息;
如1中所述,消息分发器维护的线程池会调用线程处理executor节点收件箱的消息,在Onstart消息添加进来后,即会调用executor节点(CoarseGrainedExecutorBackend对象)的onStart方法进行后续处理;
3、在executor节点的onStart方法中:
获取driver节点引用对象;
通过driver节点引用对象向driver注册executor节点;
driver节点注册executor完成后,会想executor节点回信注册成功;还会想executor节点分配任务;
4、executor节点处理driver的回信以及分配的任务:
收到回信后,实例化Executor对象;
回信处理完成后,处理driver分配的任务:给每个任务建一个线程,将线程交给Executor的线程池执行;
5.driver线程后续执行流程
在driver执行用户线程过程中:
1、首先实例化SparkContext对象;
2、初始化SparkEnv对象;在这过程中初始化RpcEnv对象;
3、在初始化RpcEnv对此过程中,构建消息分发器;针对非客户端环境,开启TransportServer;
4、初始化_schedulerBackend、_taskScheduler、_dagScheduler;
5、启动schedulerBackend、_taskScheduler,向rpcEnv注册driver节点;
6、其他DAG逻辑;
6.参考资料
spark源码-任务提交流程之-2-YarnClusterApplication
spark源码-任务提交流程之-3-ApplicationMaster
spark源码-任务提交流程之-4-container中启动executor
spark源码-任务提交流程之-5-CoarseGrainedExecutorBackend
Spark源码-任务提交流程之-6-sparkContext初始化
Spark源码-任务提交流程之-6.1-sparkContext初始化-创建spark driver端执行环境SparkEnv
Spark源码-任务提交流程之-6.2-sparkContext初始化-TaskScheduler任务调度器
边栏推荐
猜你喜欢
随机推荐
Unity物理引擎中的碰撞、角色控制器、Cloth组件(布料)、关节 Joint
【ts】typescript高阶:键值类型及type与interface区别
C语言查看大小端(纯代码)
每日一题-DFS
洞察互联网大趋势,读完这篇文章你就彻底了解中文域名
UiPath简介
CAN、CAN FD
八、请求处理之自定义类型参数绑定原理
Unity常用模块设计 : Unity游戏排行榜的制作与优化
快问快答—腾讯云服务器常见问题解答
【UiPath2022+C#】UiPath Switch
腾讯云消息队列CMQ
每日一题-二分法
多边形等分
阿里云视频点播
每日一题-最长有效括号-0724
每日一题-电话号码的字母组合-0717
Blender软件介绍与使用心得
【ts】typescript高阶:映射类型与keyof
LeetCode刷题之第24题