我们来详细讲解一下 Spark on YARN 模式下 yarn-client 和 yarn-cluster (在 Spark 后期版本中统一为 cluster 模式,但 YARN 集群模式有其特殊性) 的区别。
这是一个在学习和使用 Spark 时非常核心的概念,主要关系到Driver程序运行的位置,而这个差异又直接影响了应用程序的行为、容错、性能和适用场景。
核心概念:Driver 是什么?
在深入区别之前,必须理解 Driver 的角色。
- Driver 是 Spark 应用程序的“大脑”。
- 它执行用户的
main函数并创建SparkContext。 - 它负责:
- 将用户程序转换为有向无环图(DAG)。
- 将 DAG 调度为任务(Task),并在 Executor 上执行。
- 跟踪任务的执行情况和 Executor 的状态。
- 展示结果(例如,在
collect()操作后,将数据拉取到本地并打印)。
简单说,Driver 是应用的指挥官,而 Executor 是负责干活的士兵。
yarn-client 和 yarn-cluster 的根本区别就在于:这个“指挥官”(Driver)坐在哪里指挥作战。
1. YARN-Client 模式
运行机制
- Driver 运行在客户端机器上。也就是你提交
spark-submit命令的那台机器。 - ApplicationMaster (AM) 的角色被弱化,它主要负责向 YARN 的 ResourceManager (RM) 申请和协商 Executor 的资源。真正的 Driver 逻辑在客户端进程里。
- Executor 在 YARN 的 NodeManager (NM) 容器中启动后,会直接与客户端机器上的 Driver 进行通信。
特点
- 交互性友好:
- 因为 Driver 在本地,所以标准输出 (
stdout) 和错误输出 (stderr) 会直接打印在你的终端上。 - 你可以直接看到程序的打印语句、查询计划、进度条等。非常适合交互式的工作,比如使用
spark-shell(在 YARN 模式下,spark-shell默认就是 client 模式)。
- 因为 Driver 在本地,所以标准输出 (
- 快速失败:如果 Driver 失败,你可以立刻在终端看到错误信息,方便调试。
- 网络依赖:
- 客户端机器必须与 YARN 集群保持网络连通,因为所有的 Executor 都需要和它通信。
- 如果客户端机器网络不稳定或关机,整个应用就会失败。
- 资源占用:Driver 运行在客户端,会占用客户端机器的资源(CPU和内存)。
- 性能考量:如果 Driver 需要从 Executor 拉取大量数据(例如
collect()),所有数据都会通过网络传输到客户端机器,可能成为瓶颈。
适用场景
- 交互式开发和调试。
- 需要立即看到输出的场景,例如运行一个简单的测试或脚本。
- 当你的机器与 YARN 集群在同一个局域网,网络状况良好时。
2. YARN-Cluster 模式
运行机制
- Driver 运行在 YARN 集群内部。具体来说,它运行在 ApplicationMaster (AM) 容器里。
- 当用户提交应用后,客户端就完成任务并退出了。YARN 的 ResourceManager 会选择一个 NodeManager 来启动 AM,而这个 AM 本身就包含了 Driver 的逻辑。
- Executor 启动后,与这个在集群内部的 AM(即 Driver)进行通信。
特点
- 更适合生产环境:
- 客户端在提交作业后就可以断开连接,应用会继续在集群中运行,直到结束。这符合生产环境作业调度的需求。
- 更好的容错性:
- Driver 在 YARN 集群中运行,可以受益于 YARN 的失败重试机制。如果 AM(包含 Driver)失败,YARN 可以在另一个节点上重新启动它。
- 资源集中管理:
- Driver 的资源(CPU、内存)是通过 YARN 来管理和调度的,与客户端机器无关。这使得集群资源的管理更加统一和公平。
- 无交互性:
- 你在客户端终端看不到直接的输出。日志(包括你的
println语句)需要通过 YARN 的日志聚合功能查看(用yarn logs -applicationId <appId>命令)。
- 你在客户端终端看不到直接的输出。日志(包括你的
- 架构更简洁:所有组件都在集群内,网络通信更可靠,延迟更低。
适用场景
- 生产环境 和 批处理作业。
- 需要长时间运行的作业。
- 当客户端机器可能不稳定或需要断开连接时。
核心区别对比表格
| 特性 | YARN-Client | YARN-Cluster |
|---|---|---|
| Driver 位置 | 客户端进程 | YARN 集群内的 ApplicationMaster |
| 交互性 | 好,输出直接显示在终端 | 差,需要通过日志查看 |
| 客户端角色 | 必须保持存活和网络连通 | 提交后即可断开 |
| 容错性 | 客户端宕机导致应用失败 | YARN 可重启失败的 ApplicationMaster |
| 资源管理 | Driver 资源由客户端机器提供 | Driver 资源由 YARN 统一管理 |
| 适用场景 | 开发、测试、交互式查询 | 生产环境、批处理作业 |
| Spark Shell | 默认且唯一支持的模式 | 不支持 |
如何选择与使用
在提交应用时,通过 --deploy-mode 参数来指定模式:
YARN-Client 模式:
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \ # 指定为 client 模式
/path/to/examples.jar \
100
YARN-Cluster 模式:
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \ # 指定为 cluster 模式
/path/to/examples.jar \
100
选择建议:
- 开发和调试阶段:使用
yarn-client。你能立即看到错误信息和输出,极大提高调试效率。 - 生产环境:务必使用
yarn-cluster。它更稳定、更健壮,符合生产调度的要求。
注意:从 Spark 1.0 开始,术语有所变化。现在更通用的说法是:
client模式:对应yarn-client。cluster模式:对应yarn-cluster(当 Master 是 YARN 时)。所以你现在会经常看到
--master yarn --deploy-mode cluster这样的组合。
1万+

被折叠的 条评论
为什么被折叠?



