Spark on k8s 源码解析执行流程
1.通过spark-submit脚本提交spark程序
在spark-submit脚本里面执行了SparkSubmit类的main方法
2.运行SparkSubmit类的main方法,解析spark参数,调用submit方法
3.在submit方法里调用doRunMain方法,最终调用runMain方法
4.在runMain方法里面获取mainClass,再去执行start方法
1、准备提交环境
2、获取类加载器
3、判断是否是sparkApplication
4、执行sparkApplication的start方法
5.在start方法里面去调用KubernetesClientApplication的start方法
1、获取k8s的集群域名,调用k8s的客户端,传入spark相关配置参数
6.调用Client的run方法,通过k8s的apiserver创建Container pod 然后在container中创建driver pod
1、创建configmap
2、创建driver pod
7 Driver的启动
上面通过KubernetesClientApplication创建driver之后,会在docker的run的时候,触发ENTRYPOINT或者CMD的命令,作为容器运行的主进程。Spark镜像的ENTRYPOINT是/opt/entrypoint.sh,driver模式下里面的内容基本就是把arg参数传递给/bin/spark-submit,然后指定以client模式再次启动一个SparkSubmit进程。
创建driver的command
执行driver命令的shell文件
启动SparkSubmit的源码,和上面分析的一样,只不过这次是以client模式提交的,所以不再会调用到org.apache.spark.deploy.k8s.submit.KubernetesClientApplication,而是直接调用–class后面的作业Class的main方法,在我们的例子中就是直接执行org.apache.spark.examples.SparkPi。
SparkContext创建过程,重点是
1、创建了TaskScheduler(taskSet的调度执行)
2、DagScheduler(根据宽窄依赖划分Stage),
3、HeartbeatReceiver(executor向driver定时发送心跳)。