1. 定义与核心区别
-
本地模式(Local Mode)
-
Spark 程序在单台机器的单个 JVM 进程中运行(可配置多线程)。
-
没有分布式集群,所有计算任务和资源管理均在本机完成。
-
主要用于开发、调试和小规模测试。
-
-
集群模式(Cluster Mode)
-
Spark 程序在多台机器组成的集群中运行(如 Hadoop YARN、Apache Mesos、Kubernetes 或 Spark Standalone)。
-
任务由集群管理器分配到不同节点的 Executor 上执行,资源分布式管理。
-
适用于生产环境和大规模数据处理。
-
2. 资源分配
维度 | 本地模式 | 集群模式 |
---|---|---|
CPU/内存 | 受限于单台机器的资源(如 local[*] 使用所有核心)。 |
可跨多台机器动态分配资源,支持横向扩展。 |
并行度 | 通过线程模拟并行(如 local[4] 使用 4 线程)。 |
由集群的 Executor 数量和资源配额决定真正的并行度。 |
资源隔离 | 无隔离,资源可能被其他进程占用。 | 集群管理器(如 YARN)提供资源隔离和优先级调度。 |
3. 执行方式
-
本地模式
-
Driver 、Executor 和任务均在同一个 JVM 中运行。
-
无网络通信开销,但无法模拟真实的分布式环境。
-
-
集群模式
-
Driver 可能运行在集群中(Cluster 模式)或提交任务的客户端(Client 模式)。
-
Executor 分布在不同的节点上,通过网络与 Driver 通信。
-
任务由集群管理器调度到多个节点的 Executor 上执行。
-
4. 启动方式
本地模式
-
通过设置
master("local[*]")
或local[N]
启动。 -
无需依赖集群管理器,直接运行 Spark 程序。
spark = SparkSession.builder \
.appName("LocalExample") \
.master("local[4]) \ # 使用4个线程
.getOrCreate()
集群模式
-
提交任务到集群管理器(如 YARN、Kubernetes)。
-
使用
spark-submit
指定集群模式:
spark-submit --master yarn --deploy-mode cluster app.py
5. 网络与通信
维度 | 本地模式 | 集群模式 |
---|---|---|
数据传输 | 无网络传输,数据通过内存或本地磁盘交换。 | 数据需跨节点传输(Shuffle 操作可能产生较大开销)。 |
延迟 | 极低(本地进程内通信)。 | 受网络带宽和延迟影响。 |
6. 容错性
-
本地模式
-
单点故障:机器或进程崩溃会导致任务完全失败。
-
无自动恢复机制(需手动重启任务)。
-
-
集群模式
-
支持容错:失败的 Task 会被重新调度到其他节点执行。
-
集群管理器可监控节点健康状态,自动替换故障节点。
-
7. 适用场景
场景 | 本地模式 | 集群模式 |
---|---|---|
开发调试 | 快速验证代码逻辑,小数据集测试。 | 不适用(日志调试复杂)。 |
生产环境 | 不适用。 | 处理 TB/PB 级数据,高并发任务。 |
资源成本 | 零额外开销(仅需本地机器)。 | 需要集群硬件和运维成本。 |
8. 性能对比
-
本地模式
-
适合小数据(GB 级以下):无网络开销,快速响应。
-
大数据时可能因资源不足导致 OOM 或性能瓶颈。
-
-
集群模式
-
适合大数据:通过分布式计算和内存迭代优化处理速度。
-
但 Shuffle、数据倾斜或网络延迟可能影响性能。
-
-
本地模式是学习和测试的"沙盒",简单但资源受限。
-
集群模式是生产环境的"引擎",复杂但能处理海量数据。
根据任务规模和需求选择模式:开发阶段用本地模式快速迭代,生产环境通过集群模式实现分布式计算。