-- main 启动进程
--new SparkSubmitArguments //封装启动参数
--submit //提交
--doRunMain 执行main方法
--runMain(args: SparkSubmitArguments, uninitLog: Boolean)
--prepareSubmitEnvironment 准备环境变量
//Cluster
--childMainClass = "org.apache.spark.deploy.yarn.YarnClusterApplication"
//Client
--childMainClass = args.mainClass
--val loader = getSubmitClassLoader(sparkConf) 拿到submit的classloader
--将maven jar包添加至classpath下
-- mainClass = Utils.classForName(childMainClass) 反射加载类,childMainClass就是参数指定的-class配置
-- mainClass.getConstructor().newInstance().asInstanceOf[SparkApplication]& new JavaMainApplication(mainClass) 根据main方法创建SparkApplication
-- mainMethod.invoke(null, args)
--main 主方法
--new ClientArguments(args) 封装client参数
--parse 解析启动参数
--new Client
--yarnClient=YarnClient.createYarnClient
--client.run
--submitApplication
//创建容器的执行上下文,设置JVM参数,封装指令
(Cluster)
command=/bin/java org.apache.spark.deploy.yarn.ApplicationMaster
(Client) 逻辑与Cluster一致,实际直接调用ApplicationMaster的main方法
command=/bin/java org.apache.spark.deploy.yarn.ExecutorLauncher
-- createContainerLaunchContext(newAppResponse)
-- createApplicationSubmissionContext(newApp, containerContext)
-- yarnClient.submitApplication(appContext) //提交指令
--main
-- new ApplicationMasterArguments 封装am的参数
// 创建ApplicationMaster对象
-- new ApplicationMaster(amArgs)
-- master.run()
//Cluster
--runDriver
// 启动用户指定的--class的类
-- startUserApplication()
//获取--class指定的类的main方法
--userClassLoader.loadClass(args.userClass).getMethod("main", classOf[Array[String]])
--val userThread = new Thread 启动个用户线程去执行
--registerAM 注册AM
--client.register 获取yarn资源
--createAllocator(driverRef, userConf) 创建Yarn资源调度器
--allocateResources 分配资源
--handleAllocatedContainers 处理资源容器
--runAllocatedContainers 运行资源容器
--new ExecutorRunnable().run()
--nmClient = NMClient.createNMClient()
--startContainer()
--prepareEnvironment().asJava 准备环境
--prepareCommand() jvm参数等,封装指令,command=bin/java org.apache.spark.executor.CoarseGrainedExecutorBackend
//Client
--runExecutorLauncher
CoarseGrainedExecutorBackend
-- main
-- 模式匹配设置参数
-- run 运行executor
--onStart
-- ref.ask[Boolean](RegisterExecutor(executorId, self, hostname, cores, extractLogUrls)) ask反向注册
--receive
-- case RegisteredExecutor
--new Executor