Spark源码学习分享之submit提交流程(1)
bin/spark-submit
--class org.apache.spark.examples.SparkPi
--master yarn
--deploy-mode cluster
./examples/jars/spark-examples_2.12-3.4.4.jar 10
上述命令会进入SparkSubmit类中,先简单看下这个文件有哪些主要的方法,然后再从main方法逐步跳转,查看具体程序运行过程。
SparkSubmit包含的方法
SparkSubmit是Spark应用程序提交的核心逻辑,主要功能是解析参数、准备运行环境并启动用户应用。
1. doSubmit(args: Array[String])
-
核心入口:处理所有提交操作
-
初始化日志系统
-
解析命令行参数
-
根据操作类型分发到:
-
submit()
:提交应用 -
kill()
:终止应用 -
requestStatus()
:查询状态 -
printVersion()
:打印版本信息
-
2. parseArguments()
-
解析命令行参数为
SparkSubmitArguments
对象 -
处理所有spark-submit选项(--master, --deploy-mode等)
3. submit()
-
应用提交主流程
-
支持代理用户(--proxy-user)执行
-
处理standalone集群的REST提交回退逻辑
4. prepareSubmitEnvironment()
-
核心环境准备:构建运行环境
-
识别集群管理器(YARN/Standalone/Mesos/K8s)
-
解析依赖关系(Maven坐标)
-
下载远程资源(jars/files/archives)
-
确定主类(自动识别或用户指定)
-
特殊处理Python/R应用
-
构建类路径和系统属性
-
返回(childArgs, childClasspath, sparkConf, childMainClass)
5. runMain()
-
应用启动核心
-
加载用户主类
-
初始化类加载器并添加依赖
-
创建应用实例:
-
直接实例化(实现SparkApplication接口)
-
或封装为JavaMainApplication(传统main方法)
-
-
执行start()方法启动应用
-
异常处理和资源清理(特别是K8s环境)
6. getSubmitClassLoader()
-
创建自定义类加载器
-
支持
spark.driver.userClassPathFirst
配置 -
隔离用户代码与Spark内部类
7. kill()
& requestStatus()
-
应用管理功能
-
通过REST API或传统方式
-
支持不同集群管理器
8. 重要辅助方法
-
isShell()
:判断是否是spark-shell -
isPython()
/isR()
:识别语言类型 -
mergeFileLists()
:合并资源列表 -
resolveMavenCoordinates()
:处理--packages依赖
SparkSubmit运行流程
-- main
从main方法进入,最后会执行doSubmit
-- dosubmit
doSubmit会首先跳转到匿名函数定义的doSubmit中,然后再跳转到Submit方法的doSubmit下。
进入doSubmit后,第一步解析传入的参数(解析是通过正则匹配,匹配--后的参数)
--appArgs
appArgs对象记载了app的参数,传入的参数会覆盖空值。
第二步,匹配action,参数为空默认是submit,如图
匹配上以后,走submit方法
-- submit方法
没有传入proxyUser,走runMain()
--runMain方法
这里会获取childMainClass这个类,判断这个类是否是SparkApplication的子类,返回不同的SparkApplication对象。最后app.start。走完了sparksubmit流程