写点什么

大数据 -82 Spark 集群架构与部署模式:核心组件、资源管理与调优

作者:武子康
  • 2025-08-30
    山东
  • 本文字数:4255 字

    阅读完需:约 14 分钟

大数据-82 Spark 集群架构与部署模式:核心组件、资源管理与调优

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI 篇持续更新中!(长期更新)

AI 炼丹日志-31- 千呼万唤始出来 GPT-5 发布!“快的模型 + 深度思考模型 + 实时路由”,持续打造实用 AI 工具指南!📐🤖

💻 Java 篇正式开启!(300 篇)

目前 2025 年 08 月 18 日更新到:Java-100 深入浅出 MySQL 事务隔离级别:读未提交、已提交、可重复读与串行化 MyBatis 已完结,Spring 已完结,Nginx 已完结,Tomcat 已完结,分布式服务正在更新!深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300 篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT 案例 详解


章节内容

上节我们完成了如下的内容:


  • Spark 项目下载

  • Spark 环境配置、配置文件配置

  • 项目分发 至 h122 和 h123 服务器


Spark 集群架构

在介绍完 Spark 的核心特性和组件之后,接下来详细探讨一下 Spark 的集群架构和部署模式。理解 Spark 的集群架构有助于更好地利用其强大的分布式计算能力,以满足不同的计算需求。Spark 集群主要由以下三个核心组件组成:


  • 驱动程序

  • 集群管理器

  • 执行器

驱动程序(Driver Program)

核心功能

  1. 应用入口

  2. 驱动程序是 Spark 应用的入口点,包含 main()方法作为程序执行的起点

  3. 示例:在 Java/Scala 中,通过定义 main 方法启动;在 Python 中通过 if name == "main"启动

  4. SparkContext 管理

  5. 负责创建 SparkContext 对象(Spark 2.0+也可以是 SparkSession)

  6. SparkContext 是 Spark 功能的主要入口,提供:

  7. 集群连接管理

  8. RDD 创建和操作

  9. 累加器和广播变量支持

  10. 作业调度

  11. 任务调度与分发

  12. 将用户代码转换为 DAG(有向无环图)执行计划

  13. 将 DAG 划分为多个 Stage 和 Task

  14. 通过集群管理器(如 YARN、Mesos 或 Standalone)将 Task 分发到 Executor

详细工作流程

  1. 初始化阶段

  2. 解析应用配置参数

  3. 建立与集群管理器的连接

  4. 申请 Executor 资源(核数、内存等)

  5. 执行阶段

  6. 将用户代码转换为逻辑执行计划

  7. 进行优化(如谓词下推、列剪裁等)

  8. 生成物理执行计划

  9. 监控任务执行状态:

  10. 成功/失败任务重试

  11. 推测执行(Speculative Execution)

  12. 动态资源分配

  13. 结果处理

  14. 收集计算结果(如 collect()操作)

  15. 处理异常情况

  16. 生成执行日志和指标

运行模式

  1. 本地模式

  2. 驱动程序与 Executor 运行在同一个 JVM 中

  3. 适合开发和测试场景

  4. 集群模式

  5. Client 模式:驱动程序运行在提交节点

  6. Cluster 模式:驱动程序运行在集群工作节点

  7. 常见部署方式:

  8. Spark Standalone

  9. YARN

  10. Mesos

  11. Kubernetes

典型生命周期

  1. 启动并初始化 SparkContext

  2. 创建 RDD/DataFrame/Dataset

  3. 执行转换操作(生成 DAG)

  4. 触发行动操作(提交作业)

  5. 监控任务执行

  6. 返回结果

  7. 关闭 SparkContext

容错机制

  • 通过心跳机制检测 Executor 状态

  • 失败任务重试机制

  • 持久化(Cache/Persist)数据恢复

  • 检查点(Checkpoint)机制

性能考量

  • 驱动程序通常需要足够内存处理:

  • 任务调度开销

  • 结果聚合

  • 广播变量存储

  • 在集群模式下,网络延迟可能影响性能

集群管理器(Cluster Manager)

集群管理器是 Spark 架构中的核心组件,负责高效管理和分配集群资源。它主要实现以下功能:


  1. 资源分配:根据应用需求动态分配计算资源(CPU、内存等)

  2. 任务调度:协调驱动程序和执行器之间的任务分配

  3. 故障恢复:监控节点状态并处理失败的任务

  4. 负载均衡:优化资源利用率和任务执行效率


Spark 支持多种集群管理器,每种都适用于不同的部署场景:

1. Standalone 模式

这是 Spark 内置的轻量级集群管理器,特点包括:


  • 部署简单:只需在集群节点上安装 Spark 即可运行

  • 资源隔离:通过配置可以限制每个应用使用的资源比例

  • 典型应用场景:

  • 开发测试环境

  • 小型生产集群(通常节点数<50)

  • 快速原型验证

  • 管理工具:提供 Web UI(默认端口 8080)和命令行工具(spark-submit)

2. YARN(Yet Another Resource Negotiator)

作为 Hadoop 生态系统的核心组件,YARN 的特点包括:


  • 架构组成:

  • ResourceManager:全局资源管理器

  • NodeManager:节点级资源代理

  • ApplicationMaster:应用级资源协调器

  • 优势:

  • 与 HDFS 深度集成

  • 支持多租户资源共享

  • 成熟的生产级稳定性

  • 部署模式:

  • Client 模式:驱动程序运行在提交节点

  • Cluster 模式:驱动程序运行在 YARN 容器内

  • 典型应用:大数据分析平台、ETL 流水线

3. Mesos

Apache Mesos 是一个通用的集群资源管理系统,特点包括:


  • 两阶段调度:

  • 资源分配(Resource Offers)

  • 任务启动(Task Launch)

  • 部署模式:

  • Coarse-grained:粗粒度模式,适合长任务

  • Fine-grained:细粒度模式,适合短任务

  • 优势:

  • 支持混合负载(可同时运行 Spark、Hadoop 等服务)

  • 资源隔离(通过 Linux 容器实现)

  • 高可扩展性(支持上万节点)

  • 典型应用:多框架混合部署环境

4. Kubernetes

作为容器编排平台,Kubernetes 集成方案的特点包括:


  • 架构组件:

  • Driver Pod:运行 Spark 驱动程序的 Pod

  • Executor Pods:动态创建的执行器 Pod

  • Kubernetes Scheduler:负责资源调度

  • 优势:

  • 原生容器化支持

  • 弹性伸缩(支持 Horizontal Pod Autoscaler)

  • 多云部署能力

  • 部署方式:

  • 使用 spark-submit 直接提交

  • 通过 Operator 模式管理

  • 典型应用场景:

  • 云原生应用

  • 混合云部署

  • 微服务架构下的批处理

选择建议


注:实际选择时还需考虑现有技术栈、团队技能和运维成本等因素。

执行器(Executor)

  • 执行器是在工作节点(Worker Node)上运行的进程,负责执行分配的任务。每个执行器都具有自己的内存和 CPU 资源,并独立执行任务。

  • 执行器在整个 Spark 应用的生命周期内都会存在,它不仅执行任务,还会将数据缓存在内存中,以加快后续任务的处理速度。

Spark 的集群模式

Spark 支持多种集群部署模式,适应不同的工作环境和需求:

本地模式(Local Mode)

在本地模式下,Spark 在单一节点上运行,无需集群管理器。这种模式主要用于开发、测试和调试,不适合生产环境。使用本地模式时,可以通过指定线程数(如 local[*])来决定并行度。

集群模式(Cluster Mode)

在集群模式下,Spark 应用部署在集群中,任务分发到多个工作节点上执行。驱动程序可以运行在本地也可以运行在集群中,前者称为客户端模式(Client Mode),后者称为集群模式(Cluster Mode)。


  • 客户端模式:驱动程序在用户的本地机器上运行,适合需要频繁与用户交互的应用。用户提交应用时,集群管理器负责分配资源并启动执行器。

  • 集群模式:驱动程序在集群的一个节点上运行,适合长时间运行的作业和生产环境。用户提交应用后,集群管理器会在集群中选择一个节点作为驱动程序运行的地方。

混合模式(Mesos/Kubernetes)

在 Mesos 或 Kubernetes 模式下,Spark 可以与其他应用共享集群资源,并根据资源需求动态调整资源的分配。这种模式为大规模集群提供了更高的灵活性和资源利用率,适合企业级应用场景。

集群资源管理详解

Spark 集群资源管理概述

在 Spark 集群环境中,资源管理是确保系统高效稳定运行的核心问题。Spark 支持多种集群管理器,每种管理器都采用独特的资源分配策略来满足不同业务场景的需求。合理的资源分配策略能显著提升任务执行效率,降低资源浪费。

主要资源管理策略

1. 静态资源分配(Static Resource Allocation)

适用模式:主要用于 Spark Standalone 集群模式


工作原理


  • 管理员需要预先在 spark-defaults.conf 配置文件中设置固定参数:


  spark.executor.memory 4G  spark.executor.cores 2  spark.executor.instances 10
复制代码


  • 集群启动时,这些资源会被预先分配并保持固定

  • 资源分配基于"First Come, First Serve"原则


特点


  • 实现简单,管理方便

  • 资源利用率可能较低(尤其在任务负载波动时)

  • 适合负载稳定可预测的生产环境


典型应用场景


  • 长期运行的 ETL 作业

  • 批处理分析任务

  • 资源需求稳定的流处理应用

2. 动态资源分配(Dynamic Resource Allocation)

适用模式:YARN 和 Kubernetes 集群模式


核心机制:Spark 通过以下参数启用动态分配:


spark.dynamicAllocation.enabled truespark.dynamicAllocation.minExecutors 2spark.dynamicAllocation.maxExecutors 20spark.dynamicAllocation.initialExecutors 3
复制代码


工作流程


  1. 资源扩展:当任务积压时,Spark 会向集群管理器请求更多 executor

  2. 资源收缩:当 executor 空闲超过spark.dynamicAllocation.executorIdleTimeout(默认 60 秒)时,会被释放

  3. 弹性调度:结合 Spark 的推测执行(speculative execution)机制处理慢节点


优势特性


  • 自动根据负载调整资源规模

  • 支持优雅降级(在资源紧张时减少 executor 数量)

  • 与 Kubernetes 的 HPA(Horizontal Pod Autoscaler)或 YARN 的弹性资源管理协同工作


应用场景


  • 交互式查询(如 Spark SQL)

  • 负载波动大的流处理作业

  • 多租户共享集群环境

  • 云原生部署场景

进阶配置建议

  1. 资源隔离:在共享集群中,通过命名空间或队列隔离不同团队的资源

  2. 监控集成:结合 Prometheus 和 Grafana 监控资源使用情况

  3. 成本优化:在云环境中,可配置 spot 实例策略降低成本

性能调优提示

  • 对于长任务,适当增加spark.dynamicAllocation.executorIdleTimeout

  • 在 YARN 模式下,设置spark.yarn.executor.memoryOverhead应对 JVM 开销

  • 考虑使用资源调度器(如 YARN 的 Capacity Scheduler)实现更精细的控制

集群监控与调优

为了确保 Spark 集群的稳定运行和高效利用,集群监控与调优是不可或缺的环节。Spark 提供了多种监控工具和日志记录功能,帮助管理员了解集群的运行状态并进行调优。


  • Spark UI:这是一个基于 Web 的用户界面,显示作业的执行状态、任务的分配情况、资源的使用情况等详细信息。通过 Spark UI,用户可以深入了解应用的执行过程,并找出性能瓶颈。

  • Ganglia、Prometheus 等监控工具:这些工具可以与 Spark 集成,提供更细粒度的监控数据,帮助管理员实时监控集群的健康状态。日志与指标:Spark 生成的日志文件和性能指标数据也可以帮助管理员分析集群的运行情况,发现并解决潜在的问题。

Hadoop 集群启动

在 h121 节点上进行执行,我们启动服务:


start-all.sh
复制代码


启动的结果如下图所示:


Spark 集群启动

接着我们需要到目录下,启动集群的 Spark


cd /opt/servers/spark-2.4.5-bin-without-hadoop-scala-2.12/sbin./start-all.sh
复制代码

h121 节点

通过 jps 我可以可以看到:Master 和 Worker


h122 节点

通过 jps 我们可以看到:


h123 节点

通过 jps 我们可也看到:


查看结果

我们通过查看 h121 的日志,可以看到是 8081 的端口(我的 8080 好像是被占用了)这个在 Spark 的目录下的 logs 下,如果你也遇到了无法访问,可以看看这个 logs


测试运行

这里 Spark 提供了一个官方的 HelloWorld(前提你配置好环境变量,不然你需要到指定目录执行)


run-example SparkPi 10
复制代码



可以看到如下的结果为:


SparkShell

我们可以简单的启动一个 Shell 来测试 Spark 的效果:(后续有更深入的学习!)


spark-shell --master local-cluster[*]
复制代码


这里有一些之前测试的图片:



先不管别的,先写一段感受一下:


val rdd1 = sc.makeRDD(1 to 100).map((_, 1))rdd1.getNumPartitions
复制代码



发布于: 刚刚阅读数: 3
用户头像

武子康

关注

永远好奇 无限进步 2019-04-14 加入

Hi, I'm Zikang,好奇心驱动的探索者 | INTJ / INFJ 我热爱探索一切值得深究的事物。对技术、成长、效率、认知、人生有着持续的好奇心和行动力。 坚信「飞轮效应」,相信每一次微小的积累,终将带来深远的改变。

评论

发布
暂无评论
大数据-82 Spark 集群架构与部署模式:核心组件、资源管理与调优_Java_武子康_InfoQ写作社区