目录
[引入 Spark](#引入 Spark)
[Spark 概念](#Spark 概念)
引入 Spark
在 Spark 出现之前,大数据处理领域的主流工具是 Hadoop MapReduce,但 MapReduce 存在明显短板:
- 处理效率低:MapReduce 的中间结果会持久化到磁盘,涉及大量磁盘 I/O 操作,对于迭代计算(如机器学习算法)、交互式查询场景,性能表现极差;
- 编程模型简陋:仅支持 Map 和 Reduce 两种操作,处理复杂业务逻辑时需要拆分多个 Job 串联执行,开发效率低;
- 场景覆盖有限:无法很好地支持流处理、交互式分析等新兴大数据场景。
为了解决上述问题,加州大学伯克利分校 AMP 实验室于 2010 年开发了 Spark,2013 年捐赠给 Apache 基金会并成为顶级项目。Spark 以内存计算为核心,大幅提升了大数据处理效率,同时扩展了编程模型和应用场景,逐渐成为大数据处理生态的引擎。
Spark 概念
定义
Apache Spark 是一款快速、通用、可扩展的大数据分析计算引擎,它支持批量处理、交互式查询、实时流处理、机器学习和图计算等多种场景,它基于内存的分布式计算,减少了磁盘 I/O 开销。
相关概念
(1)RDD(Resilient Distributed Dataset)
- 弹性分布式数据集,是 Spark 最基础的数据抽象,也是早期 Spark 的数据结构;
- 特性:弹性(丢失可通过血缘关系重建)、分布式(数据分片存储在集群节点)、只读(不可修改,只能通过转换操作生成新 RDD);
- 作用:作为分布式计算的载体,屏蔽了底层数据存储和节点通信细节,让开发者专注于业务逻辑。
(2)DataFrame & Dataset
- DataFrame:结构化数据抽象,类似于关系型数据库的表,包含列名、数据类型等元数据,支持 SQL 查询,比 RDD 具有更高的查询优化效率;
- Dataset:结合了 RDD 的强类型特性和 DataFrame 的结构化优化特性,是 Spark 2.0 + 推荐的主流数据抽象,兼顾开发灵活性和执行效率。
(3)作业(Job)、阶段(Stage)、任务(Task)
- Job:由一个或多个行动操作(Action)触发的计算任务集合,对应一次完整的数据处理流程(如执行一次
count()操作会生成一个 Job); - Stage:Job 被 DAG 调度器拆分后的执行阶段,划分依据是宽依赖(Shuffle 操作,数据需要跨节点重分区),一个 Job 可以包含多个 Stage,Stage 之间按顺序执行;
- Task:Stage 的最小执行单元,对应一个数据分片的处理逻辑,多个 Task 可以在集群节点上并行执行。
(4)窄依赖与宽依赖
- 窄依赖:父 RDD 的每个分区只对应子 RDD 的一个分区,无需跨节点数据传输(如
map()、filter()操作); - 宽依赖:父 RDD 的一个分区对应子 RDD 的多个分区,需要进行 Shuffle,涉及跨节点数据传输(如
groupByKey()、reduceByKey()操作)。
(5)Shuffle
- 定义:分布式计算中,需要将不同节点上的相同 Key 数据聚合到同一节点进行处理的过程;
- 影响:Shuffle 涉及磁盘 I/O 和网络传输,优化 Shuffle 是 Spark 性能调优的方向。
Spark框架架构
Spark 采用主从架构(Master-Slave 架构),分为集群层面和应用层面两个维度,组件:
集群层面:集群管理
负责资源的分配与管理,支持三种集群管理器:
- Spark Standalone:Spark 自带的集群管理模式,简单易用,适合小规模集群;
- YARN:Hadoop 生态的资源管理器,是生产环境中最主流的 Spark 集群管理模式,支持资源动态分配;
- Kubernetes:容器化集群管理平台,适合云原生环境下的 Spark 部署。
应用层面:作业执行
每个 Spark 应用对应一个独立的执行环境,组件:
(1)Driver Program(驱动程序)
- 作用:作为 Spark 应用的入口,负责编写业务逻辑(如创建 SparkContext、定义 RDD 转换和行动操作)、生成 DAG(有向无环图)、将 Job 拆分为 Stage 并调度 Task 到 Executor;
- 部署:可以部署在客户端(Client 模式)或集群节点(Cluster 模式),生产环境常用 Cluster 模式。
(2)Executor(执行器)
- 作用:运行在集群从节点上的进程,负责执行 Task 并存储中间结果(内存或磁盘);
- 特性:每个应用对应一组独立的 Executor,Executor 进程一旦启动,会一直运行直到应用结束,避免重复创建开销;每个 Executor 包含多个 Task Slot(任务插槽),Slot 是 Spark 的最小资源单位,对应一个 CPU 核心。
(3)SparkContext(SC)
- 作用:Spark 应用的上下文对象,负责与集群管理器通信、申请资源、创建 RDD、调度任务,是连接 Spark 应用与集群的桥梁;
- 注意:在 Spark 2.0 + 中,推出了
SparkSession,封装了SparkContext、SQLContext等多个上下文,成为新一代编程入口。
(4)DAG Scheduler(DAG 调度器)
- 作用:将 Driver 生成的 DAG 拆分为多个 Stage(以宽依赖 / Shuffle 为拆分边界),并确定 Stage 的执行顺序,将每个 Stage 封装为 TaskSet 提交给 Task Scheduler。
(5)Task Scheduler(任务调度器)
- 作用:接收 DAG Scheduler 提交的 TaskSet,负责将 Task 分配到 Executor 的 Task Slot 中执行,并处理 Task 失败重试逻辑。
Spark的优势
- 速度快:基于内存计算,比 MapReduce 快 10-100 倍,即使是磁盘计算场景,也通过优化的 Shuffle 机制比 MapReduce 更快;
- 通用性强:支持多种计算场景,一套 API 即可实现批处理、流处理、SQL 查询、机器学习、图计算,无需切换不同工具;
- 易用性高:支持 Scala、Java、Python、R 等多种编程语言,提供丰富的高阶 API(如 map、reduce、filter 等),降低分布式编程门槛;
- 可扩展性好:支持横向扩展,集群节点可轻松扩展至数千个,支持多种集群管理模式,适配不同部署环境;
- 兼容性强:无缝集成 Hadoop 生态(可读取 HDFS、Hive、HBase 等数据源),支持第三方存储系统,迁移成本低。
Spark生态系统
Spark 不仅是一个计算引擎,还构建了完整的生态体系:
- Spark Core:核心模块,提供 RDD、任务调度、内存管理等基础功能,是其他组件的依赖基础;
- Spark SQL:结构化查询模块,支持 SQL 查询和 DataFrame/Dataset API,可对接 Hive、MySQL 等数据源,实现结构化数据处理;
- Spark Streaming:准实时流处理模块,基于微批处理模型(将流数据切分为小批次进行处理),支持处理 Kafka、Flume 等数据源的实时数据;
- Structured Streaming:Spark 2.0 + 推出的结构化流处理模块,基于 DataFrame/Dataset API,支持事件时间处理、状态管理,更接近真正的流处理;
- MLlib:机器学习库,提供常用的机器学习算法(分类、回归、聚类等)和工具(特征工程、模型评估),支持分布式机器学习训练;
- GraphX:图计算库,用于处理图结构数据(如社交网络、知识图谱),提供图算法(如 PageRank、最短路径)。

Spark典型应用场景
- 批量数据处理:处理大规模离线数据,如用户行为日志分析、数据仓库 ETL(抽取 - 转换 - 加载)、报表生成;
- 实时流处理:处理实时数据,如电商实时推荐、风控实时监控、日志实时分析;
- 交互式查询:通过 Spark SQL 对接 BI 工具(如 Tableau、Power BI),实现大规模数据的交互式分析和即席查询;
- 机器学习:基于 MLlib 实现大规模分布式机器学习模型训练,如用户画像构建、销量预测;
- 图计算:基于 GraphX 处理图结构数据,如社交网络关系分析、知识图谱推理。