Spark on Yarn资源调度源码解析

来源:互联网 发布:mac mini u盘重装系统 编辑:程序博客网 时间:2024/06/05 11:15

在命令行中调用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使用。

0 0