Spark 源码学习 - 应用提交-1 Submit Driver
概要
本篇博客是Application 应用提交详细流程中的第一部分,介绍在Standalone模式下,从命令行使用spark-submit提交任务开始,到将Driver提交到Master的过程。
详细流程
spark-submit提交任务
下面是Spark doc中的一个命令行提交的例子,也是我们分析任务调度的起点
注意,上图中的deploy-mode为cluster,查看spark-submit脚本内容
spark-submit中调用shell spark-class,spark-class中对Java环境变量等做了校验,最后一行处,调用exec执行命令,如下
下图是exec执行的具体命令,图中红色竖线内的部分是SPARK_ASSEMBLY_JAR,这段命令使用java -cp运行SparkSubmit中main方法,后面的参数就是命令行传入的参数,SparkSubmit类所属的jar包就在SPARK_ASSEMBLY_JAR中
org.apache.spark.deploy.SparkSubmit
shell中调用了SparkSubmit的main函数,main函数主要逻辑在处理传入的配置信息并设置为环境变量(Driver、RestSubmissionClient或Client通过环境变量读取此配置)、使用类加载器加载配置的jar等,当deploy-mode为cluster时,会借助于RestSubmissionClient或Client提交Driver,如下
然后使用反射,启动childMainClass,如下(三段单独代码)
deploy-mode为client时,上面的childMainClass为用户自己编写的Main函数,即Driver启动在执行spark-submit命令的节点。最后SparkSubmit中主要逻辑如下
org.apache.spark.deploy.Client
如SparkSubmit中最后的流程图所示,我们选择其中的Client这条执行路径,SparkSubmit使用反射运行Client的main方法,Client的main方法先处理传入的参数(和SparkSubmit中处理参数相似),然后创建RpcEnv对象,如下
如上图注释所示,ClientEndpoint的onStart发送消息给Master,注册Driver,如下
接下来看下Driver信息的格式,如下
上图中信息除了command外均容易理解,查看Command的内容
如上图注释,Spark使用DriverWrapper启动用户APP的main函数,而不是直接启动,这是为了Driver程序和启动Driver的Worker程序共命运(源码注释中称为share fate),即如果此Worker挂了,对应的Driver也会停止。至此,Client提交Driver流程结束了。
Master处理RequestSubmitDriver消息
Master的receiveAndReply方法接收Client发送的消息RequestSubmitDriver,将收到的Driver注册到waitingDrivers,如下
总结
介绍了deploy-mode=cluster模式下,从命令行提交任务,到Master端接收并注册Driver的过程,完整流程如下
附上原文地址:
Mr_JieLQ https://blog.****.net/u011564172/article/details/65653617