Spark支持多种集群部署模式,主要分为以下三类:
部署模式 | 特点 | 适用场景 | 资源管理 | 依赖 |
---|---|---|---|---|
Local模式 | 单机运行,所有进程(Driver、Executor)在同一个JVM中 | 开发调试、小规模数据测试 | 无集群资源管理,仅本地线程模拟 | 无需外部集群,仅需Spark安装包 |
Standalone模式 | Spark自带的轻量级集群管理器,支持分布式资源调度 | 中小规模集群,需独立管理资源 | Standalone Master/Worker节点管理资源 | 依赖Spark自带的集群管理组件 |
集群管理模式 | 集成外部集群管理器(如YARN、Mesos、Kubernetes) | 企业级生产环境,与现有集群系统整合 | 由外部集群管理器(如YARN)分配资源 | 需部署外部集群(如Hadoop YARN、K8s) |
核心区别
资源管理方式
Local:无资源管理,仅本地线程。
Standalone:Spark自带的Master/Worker资源调度。
集群模式:依赖外部集群管理器(如YARN的ResourceManager)。
扩展性
Local:仅单机,无法扩展。
Standalone:支持多节点,但资源调度能力较弱。
集群模式:高扩展性,适合大规模集群(如YARN支持千级节点)。
生产适用性
Local:仅限开发测试。
Standalone:适合中小规模生产环境。
集群模式:企业级生产首选(如与Hadoop生态集成)。
Spark集群模式运行时架构
在集群模式下(以YARN为例),Spark的运行时架构包含以下核心组件:
1. 核心角色
Driver
运行用户编写的
main()
函数,负责:解析代码生成DAG(有向无环图)。
将DAG拆分为Task,分发给Executor。
监控任务执行状态。
两种部署模式:
Client模式:Driver运行在提交任务的客户端机器上。
Cluster模式:Driver运行在集群的某个节点(由YARN管理)。
Executor
在Worker节点上启动的JVM进程,负责:
执行Driver分配的Task(如Map、Reduce操作)。
缓存数据(通过内存或磁盘)。
每个Executor可并行运行多个Task(由
spark.executor.cores
配置)。
Cluster Manager
外部集群管理器(如YARN ResourceManager、K8s Master):
分配集群资源(CPU、内存)。
启动Driver和Executor。
2. 运行时流程(以YARN Cluster模式为例)
提交任务
用户通过
spark-submit
提交任务到YARN ResourceManager。ResourceManager分配Container启动ApplicationMaster(Driver)。
资源申请
Driver向ResourceManager申请Executor资源。
ResourceManager通知NodeManager启动Executor容器。
任务执行
Driver将Task分发到Executor。
Executor执行Task,返回结果给Driver。
结果回收
Driver汇总结果,任务完成后释放资源。
3. 架构示意图
+-------------------+ +---------------------+
| Client Machine | | YARN Cluster |
| (spark-submit) | | |
+-------------------+ +----------+----------+
| |
| 1. Submit Job | 2. Launch AppMaster (Driver)
+-------------------------->+
|
| 3. Request Resources
+-------> ResourceManager
|
| 4. Start Executors
+-------> NodeManagers
|
+------------------+ |
| Executor | <-----------------+
| (Task Execution) | 5. Run Tasks
+------------------+
不同集群管理器的对比
集群管理器 | 特点 | 适用场景 |
---|---|---|
YARN | 与Hadoop生态深度集成,资源隔离性好 | 已部署Hadoop的环境 |
Kubernetes | 原生容器化支持,弹性伸缩能力强 | 云原生环境(如AWS EKS、GKE) |
Mesos | 通用资源调度框架,支持混合负载(如同时运行Spark和Docker) | 多框架混合集群 |
总结
部署模式选择:
开发测试用Local,轻量级集群用Standalone,生产环境优先选YARN/K8s。
架构核心:
Driver负责任务调度,Executor执行计算,Cluster Manager管理资源。
性能优化点:
Executor配置:调整CPU核数、内存大小(避免OOM)。
数据本地性:利用Spark的
locality
策略减少网络传输。