Spark提交流程
bin/spark-submit
--class org.apache.spark.examples.SparkPi
--master yarn
./examples/jars/spark-examples_2.12-3.3.1.jar 10
这一句命令实际上是 启动一个Java程序 java org.apache.spark.deploy.SparkSubmit
并将命令行参数解析到这个类的对应属性上
因为master给的是yarn,所以会通过反射创建一个yarn的client客户端,连接上yarn
yarnClient会通过submitApplication向yarn提交用户的应用程序以及让yarn准备用户应用执行的环境=> yarnClient会将java ApplicationMaster传给yarn的RM,让yarn的RM在某一个NM上启动一个容器执行java ApplicationMaster,执行之后就会在当前NM节点启动一个ApplicationMaster进程
如果是集群模式,ApplicationMaster就会执行runDriver方法启动一个Driver线程通过反射执行用户应用程序的main方法(比如org.apache.spark.examples.SparkPi)
除了启动Driver线程之外,ApplicationMaster会调用registerAM方法创建AMRMClient用来实现AM和RM的交互,AM会通过AMRMClient向RM反馈用户程序的main方法已经开始执行并向RM申请Container,AM获取到Container后会遍历这些Container,在遍历的过程中会生成一个NMClient用来和Container交互,NMClient会向Container发送java Executor生成一个ExecutorBackend进程(Executor),这个Executor进程(类)内部有一个executor属性(也是一个类),这个executor属性才是真正用来计算的,而Executor进程是用来和ApplicationMaster这个进程交互的(实际是和AMMaster的Driver线程通信)。
excutor属性中有一个线程池,用来并行执行多个TASK