本文是大数据系列第 67 篇,系统梳理大数据计算引擎的三代演进,重点介绍 Spark 的设计哲学与核心组件。

完整图文版(含截图):CSDN 原文 | 掘金

三代计算引擎演进

大数据处理技术经历了三个主要阶段:

阶段代表技术定位
第一代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 操作触发的计算作业
StageJob 按 Shuffle 边界划分的计算阶段
TaskStage 内分配到单个分区的最小执行单元

一个 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,惰性执行,如 mapfiltergroupByKey
  • Action(行动):触发实际计算,返回结果或写出数据,如 collectcountsaveAsTextFile

惰性求值是 Spark 优化执行计划的关键——在遇到 Action 之前,Spark 只记录转换逻辑,不做实际计算,从而可以对整个 DAG 进行全局优化。