前言
在第五篇文章 Yarn Client 模式提交流程(五) 中,我们详细分析了 Yarn Client 模式的提交流程。本文继续分析 Yarn Cluster 模式的提交流程,重点介绍与 Client 模式的关键差异——Driver 如何在 AM 内启动。
版本
Spark 3.2.3
Yarn Cluster 模式概述
Yarn Cluster 模式下,Driver 运行在 YARN 集群的 ApplicationMaster 容器中,客户端提交后即可断开,作业在集群中独立运行。
1 | // 提交命令示例 |
与 Yarn Client 模式的核心区别
| 特性 | Yarn Client | Yarn Cluster |
|---|---|---|
| Driver 位置 | 客户端 | AM 内部 |
| childMainClass | args.mainClass(用户类) | YarnClusterApplication |
| isClusterMode 判断 | args.userClass == null | args.userClass != null |
| AM 入口方法 | runExecutorLauncher() | runDriver() |
| 资源申请时机 | AM 启动后直接申请 Executor(Driver 已在客户端运行) | AM 先启动 Driver 线程,等 SparkContext 初始化完毕后再申请 Executor |
| 资源申请顺序 | Driver → AM → Executor | AM → Driver → Executor |
| Driver 启动方式与位置 | 客户端先启动 Driver(app.start 直接反射调用用户 main 方法),Driver 初始化 SparkContext 时,在 YarnClientSchedulerBackend.start() 中提交 Application 启动 AM |
客户端先启动 AM(app.start → YarnClusterApplication.start() → Client.run() → submitApplication() 提交 Application),AM 的 runDriver() 中再通过 startUserApplication() 反射调用用户 main 方法启动 Driver |
| 跨线程同步机制 | 无。Driver 在客户端主线程运行,AM 与 Driver 是两个独立进程,不需要跨线程同步 | Promise + wait/notify。Driver(用户线程)与 AM 主线程在同一进程不同线程,SparkContext 初始化完后通过 YarnClusterScheduler.postStartHook() → sparkContextInitialized() 填充 Promise,通知 AM 主线程 awaitResult 返回;用户线程通过 wait() 挂起,等 AM 注册和申请完资源后通过 resumeDriver() → notify() 唤醒 |