本文是大数据系列第 67 篇,系统梳理大数据计算引擎的三代演进,重点介绍 Spark 的设计哲学与核心组件。
三代计算引擎演进
大数据处理技术经历了三个主要阶段:
| 阶段 | 代表技术 | 定位 |
|---|---|---|
| 第一代 | MapReduce | 批处理,磁盘驱动 |
| 第二代 | Spark | 内存计算,统一批流 |
| 第三代 | Flink | 真流处理,事件驱动 |
Spark 诞生于 2009 年 UC Berkeley AMPLab,2014 年成为 Apache 顶级项目,目前在国内生产环境中占据主导地位。
MapReduce 的局限
MapReduce 开创了分布式批处理的先河,但随着业务复杂化,其短板逐渐暴露:
- 磁盘 IO 开销大:每个 MapReduce 作业的中间结果都要写到 HDFS,多步骤 ETL 场景频繁读写磁盘
- 表达能力有限:只有 Map 和 Reduce 两个阶段,复杂逻辑需拆分成多个 Job 串行执行
- 延迟高:每个 Job 都需要重新申请资源、启动 JVM,分钟级延迟无法满足交互查询需求
- 不支持流处理:天然是批处理模型,无法处理实时数据流
Spark 的核心优势
内存计算
Spark 最核心的创新是将中间计算结果保存在内存中,而非每次都落盘。在迭代算法(机器学习、图计算)场景下,相比 MapReduce 可实现 100 倍以上的速度提升;即使是批处理场景,通常也有 10 倍左右的加速。
统一计算引擎
Spark 提供统一的编程模型,一个框架覆盖多种场景:
- Spark Core:基础 RDD 抽象与任务调度
- Spark SQL:结构化数据查询,兼容 Hive
- Spark Streaming / Structured Streaming:流批一体处理
- MLlib:内置 80+ 机器学习算法
- GraphX:图计算框架
这意味着团队只需掌握一套 API,无需在不同框架之间切换。
多语言支持
官方支持 Scala、Java、Python、R 四种语言,并提供 REPL 交互环境,降低了数据科学家的使用门槛。
核心概念速览
理解 Spark 需要先掌握以下关键术语:
| 概念 | 说明 |
|---|---|
| Application | 用户提交的 Spark 程序 |
| Driver Program | 运行 main() 函数、创建 SparkContext 的进程 |
| Executor | 在 Worker 节点上运行任务的进程 |
| Job | 由一个 Action 操作触发的计算作业 |
| Stage | Job 按 Shuffle 边界划分的计算阶段 |
| Task | Stage 内分配到单个分区的最小执行单元 |
一个 Application 包含多个 Job,一个 Job 包含多个 Stage,一个 Stage 包含多个 Task。Task 是真正跑在 Executor 上的最小粒度。
部署模式
Spark 支持三种主要部署方式:
- Standalone:Spark 自带的资源管理模式,适合独立集群
- YARN:与 Hadoop 生态集成,国内生产环境最主流
- Kubernetes:容器化部署,云原生趋势
Driver 与 Executor 的关系:Driver 负责解析程序、生成执行计划、调度 Task;Executor 接收 Task、执行计算、将结果返回给 Driver。
RDD 的核心地位
RDD(Resilient Distributed Dataset,弹性分布式数据集) 是 Spark 最基础的数据抽象。所有高级 API(DataFrame、Dataset)底层都构建在 RDD 之上。RDD 的两类操作:
- Transformation(转换):返回新 RDD,惰性执行,如
map、filter、groupByKey - Action(行动):触发实际计算,返回结果或写出数据,如
collect、count、saveAsTextFile
惰性求值是 Spark 优化执行计划的关键——在遇到 Action 之前,Spark 只记录转换逻辑,不做实际计算,从而可以对整个 DAG 进行全局优化。