Spark-Yarn任务提交流程解析

YARN架构解析:SparkSubmit、ApplicationMaster与ExecutorBackend详解
本文详细解读了SparkSubmit的运行流程,从提交脚本到YarnClusterApplication的实例化,再到ApplicationMaster的启动、资源分配和ExecutorBackend的执行,展示了分布式计算框架中的关键组件交互。

一、SparkSubmit

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10

打开spark-submit 脚本

 

 

 

 

 

 

 

 

 

 进入 org.apache.spark.deploy.yarn.YarnClusterApplication

 

 

 

 

查看 submitApplication

 查看 createContainerLaunchContext

 小结:

SparkSubmit

    -- main
    
        -- doSubmit
        
            // 解析参数
            -- parseArguments
            
                // master => --master => yarn
                // mainClass => --class => SparkPi(WordCount)
                -- parse
                
            -- submit
            
                -- doRunMain
                
                -- runMain
                
                    // (childArgs, childClasspath, sparkConf, childMainClass)
                    // 【Cluster】childMainClass => org.apache.spark.deploy.yarn.YarnClusterApplication
                    // 【Client 】childMainClass => SparkPi(WordCount)
                    -- prepareSubmitEnvironment
                    
                    // Class.forName("xxxxxxx")
                    -- mainClass : Class = Utils.classForName(childMainClass)
                    
                    // classOf[SparkApplication].isAssignableFrom(mainClass)
                    -- 【Cluster】a). mainClass.getConstructor().newInstance().asInstanceOf[SparkApplication]
                    -- 【Client 】b). new JavaMainApplication(mainClass)
                    
                    -- app.start
                    
YarnClusterApplication

    -- start
    
        // new ClientArguments
        // --class => userClass => SparkPI(WordCount)
        -- new Client
        
        -- client.run
        
            -- submitApplication
            
                // 【Cluster】 org.apache.spark.deploy.yarn.ApplicationMaster
                // 【Client 】 org.apache.spark.deploy.yarn.ExecutorLauncher
                --createContainerLaunchContext
                --createApplicationSubmissionContext

 二、ApplicationMaster

 

 这里不得不提一下,scala的模式匹配真是优雅

 

 启动Driver

 

 

 注册AM

资源分配 

 

 

 

 启动 NodeManager

 

 

 

小结 

ApplicationMaster

    -- main
    
        // --class => userClass => SparkPi(WordCount)
        -- new ApplicationMasterArguments
        
        -- master = new ApplicationMaster
        
        -- master.run()
        
        -- 【Client 】runExecutorLauncher
        -- 【Cluster】runDriver
        
            -- userClassThread = startUserApplication()
            
                -- ClassLoader.loadClass(args.userClass)
                    getMethod("main")
                    
                -- new Thread().start()
                
                    -- run
                        -- mainMethod.invoke(null, userArgs.toArray)
                        
                            -- WordCount
                            
                                -- new SparkContext() // 创建Spark的环境
                                -- 【blocking....................】
            
            // Blocking -----------------------------------------
            -- val sc = ThreadUtils.awaitResult
            
            // 注册
            -- registerAM
            
            // 资源分配
            -- createAllocator
            
                -- allocator.allocateResources
                
                    -- handleAllocatedContainers
                    
                        -- runAllocatedContainers
                        
                            // bin/java org.apache.spark.executor.YarnCoarseGrainedExecutorBackend
                            -- prepareCommand
            
            -- resumeDriver // 执行Spark作业
            -- userClassThread.join()

三、ExecutorBackend

 

 

  

小结 

YarnCoarseGrainedExecutorBackend

    -- main
    
        -- CoarseGrainedExecutorBackend.run
        
            -- val env = SparkEnv.createExecutorEnv
            
            -- env.rpcEnv.setupEndpoint("Executor")

四、Task

 

 

 

 

 

 

 

 

 

 

小总结

  

 

SparkYARN上以客户端模式进行任务提交的方法和流程如下: ### 提交方法 在启动Yarn集群后,可在node5节点上执行以下命令以Client模式提交任务: ```bash [root@node5 ~]# cd /software/spark-3.5.5/bin/ #第一种方式 [root@node5 bin]# ./spark-submit --master yarn --class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.13-3.5.5.jar 1000 #第二种方式 [root@node5 bin]# ./spark-submit --master yarn --deploy-mode client --class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.13-3.5.5.jar 1000 ``` 以上两种方式均可实现以客户端模式提交Spark任务YARN集群,其中`--master yarn`指定使用YARN作为资源管理器,`--class`参数指定要执行的主类,后面跟上应用程序的JAR包路径和所需的参数 [^1]。 ### 提交流程 1. **客户端提交Spark任务**:在客户端提交Spark任务,Driver在客户端启动 [^3]。 2. **客户端权限验证与资源上传**:客户端(Client)通过YARN的ResourceManager提交应用程序。在此过程中,客户端进行权限验证,生成Job ID和资源上传路径,并将这些信息返回给客户端。客户端将jar包、配置文件、第三方包等文件上传到指定的HDFS路径 [^4]。 3. **申请启动ApplicationMaster**:客户端向ResourceManager申请启动ApplicationMaster。RM收到请求之后,随机找到一台NodeManager节点,启动ApplicationMaster [^3]。 4. **ApplicationMaster启动与资源申请**:ApplicationMaster启动后,从HDFS中拉取jar包,解析数据流(DAG),根据数据流生成阶段(Stage),确定任务的并发度,并采用轮询的方式向RM申请资源,RM返回一批NM节点 [^3][^4]。 5. **启动Executor**:AM连接NM节点启动Executor,Executor启动之后注册给Driver [^3]。 6. **任务执行与监控**:Driver发送task,监控task执行,回收结果。各个任务向AM汇报自己的状态和进度,以便当任务失败时可以重启任务。当所有任务执行完毕时,ApplicationMaster通知ResourceManager注销应用,回收资源 [^3][^4]。 ### 模式特点 客户端模式提交任务,会在客户端看到task的执行情况和结果,当在客户端提交多个application时,每个application都会启动自己的Driver,Driver与集群Worker有大量的通信,会造成客户端网卡流量激增问题。这种模式适用于程序测试,不适用于生产环境 [^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值