在 YARN-Cluster 模式中,当用户向 YARN 中提交一个应用程序后,YARN 会分两个阶段运行该应用程序:
第一个阶段是把 Spark 的 Driver 作为一个 ApplicationMaster 在 YARN 集群中先启动;
第二个阶段是由 ApplicationMaster 创建应用程序,然后为它向 ResourceManager 申请资源,并启动 Executor 来运行Task,同时监控它的整个运行过程,直到运行完成。
具体流程如下:
1.在YARN Cliuster 模式下,Driver运行在ApplicationMaster中。程序启动后会和ResourceManager 通讯申请ApplicationMaster
2.ResourceManager 收到请求后,通过 ResourceScheduler 选择一台 NodeManager 分配一个 Container,在 Container 中开启 ApplicationMaster 进程;同时在 ApplicationMaster 中初始化 Driver;
3.ApplicationMaster 向 ResourceManager 注册,这样用户可以直接通过 ResourceManage 查看应用程序的运行状态,然后
它将采用轮询的方式通过 RPC 协议为各个任务申请资源,并监控它们的运行状态直到运行结束;
4.一旦 ApplicationMaster 申请到资源(也就是 Container)后,便与对应的 NodeManager 通信,在 NodeManager 的 Container 中启动 CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend 启动后会向 Driver 中的 SparkContext 反向注册并申请 Task。这一点和 Standalone 模式一样,只不过 SparkContext 在 Spark Application 中初始化时,使用 CoarseGrainedSchedulerBackend 配合 YarnClusterScheduler 进行任务的调度,其中YarnClusterScheduler 只是对 TaskSchedulerImpl 的一个简单包装,增加了对 Executor 的等待逻辑等;
5.ApplicationMaster 中的 SparkContext 分配 Task 给 CoarseGrainedExecutorBackend 执行,CoarseGrainedExecutorBackend运行 Task 并向 ApplicationMaster 汇报运行的状态和进度,方便 ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;
6.应用程序运行完成后,ApplicationMaster 向 ResourceManager 申请注销并关闭自己。
7.该模式下只能通过 YARN 查看日志。