在命令行中调用SparkSubmit类启动Spark自定义Jar包执行的时候当前节点调用的有主函数的类名childMainClass分为
-----------------
standalone: org.apache.spark.deploy.rest.RestSubmissionClient
client:jar包中main函数,默认形式
yarn-cluster:org.apache.spark.deploy.yarn.Client
memos:org.apache.spark.deploy.rest.RestSubmissionClient
在SparkContext文件各调度模式的相关类
-----------------
local:LocalSparkCluster + SparkDeploySchedulerBackend + TaskSchedulerImpl
yarn-cluster: YarnClusterSchedulerBackend + YarnClusterScheduler
yarn-client:YarnClientSchedulerBackend + YarnScheduler
standalone:SparkDeploySchedulerBackend + TaskSchedulerImpl
memos:MesosSchedulerBackend + TaskSchedulerImpl
yarn-cluster模式各节点所执行的代码入口
-----------------
在客户端节点做的事情:
SparkSubmit//提交自定义程序并在在客户端机器本地建立运行环境
submit.doRunMain.runMain
loader//设置类加载器
Client.main
YarnClient.submitApplication
在yarn集群中选的Driver程序运行节点做的事情:
ApplicationMaster.main//yarn-cluster模式Driver所在节点
run.runDriver
在yarn集群其它节点做的事情:
ExecutorLauncher.main//yarn-cluster模式Executor所在节点
ApplicationMaster.main
run.runExecutorLauncher//启动executor程序
yarn-cluster模式用户命令界面提交执行->初始化->调度->划分stage->生成task和tasket并提交执行的流程
----------------
SparkSubmit//提交自定义程序并在在客户端机器本地建立运行环境
submit.doRunMain.runMain
loader//设置类加载器
mainMethod.invoke//调用类的main方法,这个类根据不同调度模式是不同的类,具体参考本页面中关于childMainClass的内容
SparkContext//构造函数和成员变量初试化
DAGScheduler//新建对象DAGScheduler
new YarnClusterScheduler//TaskSchedulerImpl
new YarnClusterSchedulerBackend//RPC通信
TaskScheduler.start
YarnClusterSchedulerBackend.start
textFile//产生RDD和RDD对应的Partition,以及底层存储Block
RDD.map//RDD变换为另一个RDD,用于构造关系暂不实际计算
RDD.reduce//根据前面构造的依赖关系开始实际计算
SparkContext.runJob
DAGScheduler.runJob.submitJob
DAGSchedulerEventProcessLoop.post//触发任务提交事件,任务调度开始
eventQueue.put
eventQueue.take
DAGSchedulerEventProcessLoop.onReceive
DAGScheduler.handleJobSubmitted
newResultStage//构造final stage
updateJobIdStageIdMaps//通过RDD之间的依赖构造Stage间依赖关系
submitStage
submitMissingTasks
Serializer.serialize//对任务信息编组
partitionsToCompute//根据Stage类型对每个Partition建立对应Task
new ShuffleMapTask/ResultTask
TaskScheduler.submitTasks//进入Task级别的调度,在此处区分不同调度类型的行为
new TaskSet
createTaskSetManager
new TaskSetManager
SchedulableBuilder.addTaskSetManager//进入单机多任务的调度
FIFOSchedulableBuilder/FairSchedulableBuilder
SchedulerBackend.reviveOffers//实际调度程序
SparkDeploySchedulerBackend/YarnClusterSchedulerBackend/MesosSchedulerBackend
RpcEndpointRef.send
AkkaRpcEndpointRef.send
ActorRef ! AkkaMessage
Driver和Executor节点注册,分配资源和启动的流程
----------------
YarnClusterSchedulerBackend.start
Client
submitApplication
createContainerLaunchContext
ApplicationMaster.main//yarn-cluster模式Driver和ApplicationMaster所在节点
run.runDriver
startUserApplication//启动远程driver程序
mainMethod.invoke
runAMEndpoint//ApplicationMaster通信地址
registerAM//在ResourceManager上注册ApplicationMaster
YarnRMClient.register//
AMRMClient.registerApplicationMaster//进入Yarn原生API
new YarnAllocator//分配container的
YarnAllocator.allocateResources
AMRMClient.allocate//进入Yarn原生API
handleAllocatedContainers
runAllocatedContainers
new ExecutorRunnable
run
NMClient.start
startContainer
NMClient.startContainer//进入Yarn原生API
ExecutorLauncher.main//yarn-cluster模式Executor所在节点
ApplicationMaster.main
run.runExecutorLauncher//启动executor程序
waitForSparkDriver//等待客户端driver程序就绪
RpcEnv.create//建立ApplicationMaster和Driver通讯的RPC地址
runAMEndpoint//
registerAM
createApplicationSubmissionContext
YarnClient.submitApplication//进入Yarn原生API
JobScheduler//只在Streaming模块中使用,配合JobGenerator使用。