为了理清 Spark 运行方式、部署模式(master)、部署方式(deploy-mode) 之间的关系,我们先明确几个核心概念,再对比它们的联系与区别。
一、核心概念解析
1. Spark 运行方式(代码执行方式)
指 如何启动和运行 Spark 代码,
就是代码在哪上面运行
常见有三种:
-
REPL 方式(交互式)
- 工具:
spark-shell
(Scala/Java)、pyspark
(Python)、spark-sql
(SQL)。 - 特点:
- 直接在命令行中输入代码,实时交互式执行(类似 Python 的
ipython
)。 - 仅适用于开发调试,无法用于生产环境(代码无法保存、性能差)。
- 默认运行模式:通常是 本地模式(local),因为交互式环境一般在单节点执行。
- 直接在命令行中输入代码,实时交互式执行(类似 Python 的
- 工具:
-
spark-submit 方式(任务提交)
- 流程:
- 先将代码打包成 JAR 包(或 Python 脚本)。
- 通过
spark-submit
命令提交到 Spark 集群(或本地)运行。
- 特点:
- 生产环境唯一方式,支持各种部署模式(本地、YARN、Spark Standalone 等)。
- 可通过参数(如
--master
、--deploy-mode
)灵活配置运行环境。
- 流程:
-
集成开发环境(IDE,如 IDEA)
- 流程:
在 IDE 中编写代码,直接运行(需配置 Spark 依赖和环境)。 - 特点:
- 用于开发调试,本质上是 本地模式运行(类似 REPL,但可调试代码)。
- 不涉及集群部署,适合单机测试。
- 流程:
更详细的Spark运行方式请见
辨析Spark代码的不同运行方式:交互,submit,集成开发环境-CSDN博客
2. 运行模式(master 参数)
指 Spark 应用运行时的资源管理方式,通过 --master
指定,决定了任务运行在 单机 还是 集群:
简单来说就是指定 Spark 应用在哪里运行(单机 / 集群 / 云平台)
-
本地模式(local)
- 场景:单机测试(如开发阶段)。
- 示例:
--master local
:单线程,仅用 1 个 CPU 核心。--master local[2]
:2 个线程,模拟多任务并行(但仍在单节点)。
- 特点:
- 不涉及集群,所有任务在 本地 JVM 中运行,无需启动集群服务。
- 适合调试代码逻辑,但无法测试集群环境的资源调度、容错等特性。
-
集群模式(YARN/Spark Standalone/Kubernetes)
- 场景:生产环境,多节点分布式计算。
- 示例:
- YARN 模式:
--master yarn
(需指定--deploy-mode
)。 - Spark Standalone 模式:
--master spark://host:port
(Spark 自带的集群管理)。
- YARN 模式:
- 特点:
- 需要一个 集群资源管理器(如 YARN)分配资源。
- 任务会被分发到集群中的多个节点执行,支持高并发、高可用。
3. 部署方式(deploy-mode 参数)
仅在 集群模式(master 为 yarn/spark://...) 下有效,决定 Driver 进程的位置:
其实就是指定 Driver 进程的运行位置(本地客户端 / 集群节点)
-
client 模式
- Driver 运行位置:提交任务的节点(如本地机器或集群中的某节点)。
- 适用场景:
- 交互式任务(如
spark-sql
),需实时查看日志和结果。 - 开发调试阶段,方便直接观察 Driver 输出。
- 交互式任务(如
- 限制:
- 提交任务的节点必须与集群保持网络连通,否则 Driver 会挂掉。
- 生产环境中若本地机器宕机,任务会失败。
-
cluster 模式
- Driver 运行位置:集群内部的某个节点(由资源管理器分配)。
- 适用场景:
- 生产环境,Driver 与 Executor 均在集群内,稳定性更高。
- 任务提交后可断开本地连接,不影响运行(如后台任务)。
- 特点:
- 日志需通过集群命令(如
yarn logs
)查看,无法实时在本地显示。
- 日志需通过集群命令(如
更详细的辨别运行模式和部署方式,请见
Spark 的运行模式(--master) 和 部署方式(--deploy-mode)-CSDN博客
二、三者的联系与区别
维度 | REPL 方式 | spark-submit 方式 | IDE 运行 |
---|---|---|---|
本质 | 交互式命令行工具 | 任务提交工具(生产环境核心) | 开发工具(本地调试) |
支持的 master | 仅 local 模式 | 所有模式(local/yarn/standalone) | 仅 local 模式 |
是否需要打包 | 不需要(直接输入代码) | 需要(打成 JAR 或脚本) | 不需要(IDE 直接运行) |
deploy-mode | 不涉及(仅本地) | 集群模式下需指定(client/cluster) | 不涉及(仅本地) |
三、常见场景举例
1. 本地调试(开发阶段)
- 需求:测试代码逻辑,不涉及集群。
- 方式:
- 用
spark-shell
或 IDE(如 IDEA)直接运行,master
默认是local
。 - 示例:
spark-shell # 自动以 local 模式启动,单线程
- 用
2. 单机模拟多线程(测试并行逻辑)
- 需求:在本地用多个线程模拟分布式任务并行。
- 方式:
- 用
spark-submit
指定--master local[2]
。 - 示例:
spark-submit --master local[2] --class MyApp myapp.jar
- 用
3. 提交到 YARN 集群(生产环境)
- 需求:在多节点集群上运行任务,Driver 位于集群内。
- 方式:
spark-submit
指定--master yarn --deploy-mode cluster
。- 示例:
spark-submit \ --master yarn \ --deploy-mode cluster \ --class MyApp \ myapp.jar arg1 arg2
四、总结:为什么会混淆?
-
运行方式 vs 部署模式:
- 运行方式(REPL/IDE)是 开发工具,仅用于本地调试;
spark-submit
是 提交工具,支持所有环境。 - 运行模式(master)决定任务运行在 单机 还是 集群,与代码的运行方式无关(但 REPL/IDE 只能用本地模式)。
- 运行方式(REPL/IDE)是 开发工具,仅用于本地调试;
-
deploy-mode 仅在集群模式下有效:
- 本地模式(local)没有集群节点,因此无需区分 Driver 位置,
deploy-mode
参数被忽略。 - 只有当
master
是yarn或者
spark://...
时,才需要考虑client
或cluster
模式。
- 本地模式(local)没有集群节点,因此无需区分 Driver 位置,
通过 “代码的运行方式管开发,master 管资源在哪里,deploy-mode 管 Driver 在哪里” 的逻辑,可快速理清三者关系。实际使用中,开发阶段用 REPL/IDE(本地模式),生产环境用 spark-submit
提交到集群(指定 master 和 deploy-mode)。