在 YARN Cluster 模式下,Spark 应用的 Driver 生成流程涉及多个关键步骤,其核心在于 Driver 作为 ApplicationMaster(AM)的一部分在集群中启动。以下是具体流程的详细解析:
1. 客户端提交应用
用户通过 spark-submit
脚本提交应用,指定 --deploy-mode cluster
。此时:
SparkSubmit
主类解析参数,确定部署模式为 YARN Cluster,主类设置为org.apache.spark.deploy.yarn.Client
。- 构建应用提交上下文,包括上传应用 JAR 文件、依赖库到 HDFS,并配置 AM 的启动命令(如 Java 路径、启动类
ApplicationMaster
)。
2. ResourceManager 分配资源
- 客户端通过
YarnClient
向 ResourceManager(RM)提交应用请求,RM 返回一个 Application ID 并分配第一个 Container(用于启动 AM)。 - Container 启动命令指定了启动 AM 的 Java 进程,例如:
该命令会在选定的 NodeManager 节点上执行。java org.apache.spark.deploy.yarn.ApplicationMaster [用户参数]
3. ApplicationMaster 启动与 Driver 生成
- AM 在分配的 Container 中启动,并执行以下操作:
- 初始化 SparkContext:AM 调用
startUserApplication
方法,启动一个新线程执行用户代码(即--class
指定的主类),触发SparkContext
初始化。此时,Driver 线程在 AM 进程中生成。 - 注册 AM 到 RM:AM 向 RM 注册,以便用户可通过 RM 监控应用状态。
- 申请 Executor 资源:AM 通过 RM 申请 Container 资源,每个 Container 对应一个 Executor。
- 初始化 SparkContext:AM 调用
4. Executor 启动与任务执行
- NodeManager 启动 Executor:AM 与 NodeManager 通信,在分配的 Container 中启动
CoarseGrainedExecutorBackend
进程。 - Executor 向 Driver 注册:Executor 启动后,与 AM 中的 Driver 通信完成注册,等待任务分配。
- 任务调度与执行:Driver 通过
DAGScheduler
和TaskScheduler
将任务拆分为 TaskSet,分发到 Executor 执行,并监控任务状态。
5. 应用结束与资源释放
- 任务完成后,AM 向 RM 注销应用,释放所有 Container 资源。
- 日志与状态反馈:最终状态通过 YARN 的日志聚合机制查看,客户端不会直接显示结果(适合输出到 HDFS 等外部存储的场景)。
关键流程对比
步骤 | YARN Cluster 模式特点 |
---|---|
Driver 位置 | 在 AM 进程中运行,由集群动态分配节点。 |
客户端角色 | 仅提交任务,不参与任务执行或结果收集。 |
容错机制 | 若 AM(即 Driver)失败,YARN 会尝试重启 AM(需配置 spark.yarn.maxAppAttempts )。 |
示例代码与命令
提交 YARN Cluster 模式应用的典型命令:
spark-submit \--master yarn \--deploy-mode cluster \--class org.apache.spark.examples.SparkPi \examples/jars/spark-examples.jar \1000
此命令会触发上述完整流程,最终在集群的某个 NodeManager 上生成 Driver。
总结
YARN Cluster 模式下,Driver 的生成本质是 通过 AM 进程在集群中动态启动用户代码并初始化 SparkContext
。这种设计使得 Driver 生命周期由 YARN 管理,适合生产环境中需要高可靠性和资源调度的场景。