ARTICLE

Apache Spark

Apache Spark Apache Spark 是一个开源的、基于内存计算的分布式大数据处理引擎,由加州大学伯克利分校 AMPLab 于 2009 年开发,2010 年开源,2014 年成为 Apache 软件基金会顶级项目。Spark 的设计目标是解决 Hadoop分布式文件系统 生态中 MapReduce 模型的性能瓶颈——特别是迭代算法和交互式查询

浏览 0 更新 2025-11-08

Apache Spark

Apache Spark 是一个开源的、基于内存计算的分布式大数据处理引擎,由加州大学伯克利分校 AMPLab 于 2009 年开发,2010 年开源,2014 年成为 Apache 软件基金会顶级项目。Spark 的设计目标是解决 Hadoop分布式文件系统 生态中 MapReduce 模型的性能瓶颈——特别是迭代算法和交互式查询场景中频繁的磁盘 I/O 开销——通过将中间结果缓存在内存中,实现比 MapReduce 快 10 至 100 倍的计算速度。

核心抽象:弹性分布式数据集

Spark 的核心数据抽象是 弹性分布式数据集 (Resilient Distributed Dataset, RDD)。RDD 是一个不可变的、分区化的、可并行操作的分布式对象集合,具有以下关键特性:

  1. 分区 (Partitions):数据被自动划分为多个分区,分布在集群各节点上并行处理。
  2. 依赖关系 (Lineage):RDD 记录了其"血统"——即从父 RDD 转换而来的完整操作序列。这使得 Spark 能够在节点故障时仅重新计算丢失分区,而非整体回滚,实现了高效的容错机制。
  3. 延迟计算 (Lazy Evaluation):所有的 转换操作 (Transformations,如 \texttt{map}、\texttt{filter}、\texttt{join}) 并不立即触发计算,仅构建执行计划的有向无环图;直到遇到 动作操作 (Actions,如 \texttt{count}、\texttt{collect}、\texttt{save}) 时,才触发 DAG 调度器对全图进行优化并提交执行。

RDD 的操作分为两类:

  • 转换 (Transformation):从已有数据集创建新数据集,惰性执行。典型操作包括 \texttt{map}、\texttt{flatMap}、\texttt{filter}、\texttt{reduceByKey}、\texttt{groupByKey} 等。
  • 动作 (Action):对数据集进行计算并将结果返回给驱动程序或写入外部存储,触发实际计算。典型操作包括 \texttt{reduce}、\texttt{collect}、\texttt{count}、\texttt{foreach} 等。

生态组件

Spark 以 Spark Core 为核心引擎,围绕其构建了完整的统一分析平台:

  1. Spark SQL:提供结构化数据处理能力,支持 SQL 查询和 \texttt{DataFrame}/\texttt{Dataset} API。通过 Catalyst 优化器进行查询优化,可与 Apache Hive 无缝集成。
  2. Spark Streaming:基于微批次 (Micro-batch) 架构的准实时流处理引擎。将实时数据流切分为小批次,以近乎实时的方式进行处理。Spark 2.0 引入的 结构化流 (Structured Streaming) 进一步将流数据视为无界表,统一了批处理与流处理的编程模型。
  3. MLlib:分布式机器学习库,涵盖分类、回归、聚类、协同过滤、降维等常用算法,以及特征工程工具和模型评估方法。
  4. GraphX:图计算与图并行计算库,支持 Pregel 抽象和一系列图算法,适合社交网络分析、推荐系统等场景。

与 MapReduce 的对比

Spark 与 Hadoop MapReduce 的关键差异体现在以下几个方面:

  • 计算模型:MapReduce 严格遵循"Map → Shuffle → Reduce"的线性数据流,每个阶段结束后将中间结果写入 HDFS,导致大量磁盘 I/O。Spark 使用 DAG 执行引擎,允许多阶段流水线化执行,中间结果优先驻留在内存中。
  • 性能:对于迭代算法(如 梯度下降 的机器学习训练)和交互式查询,Spark 的内存缓存机制可将性能提升 1--2 个数量级。
  • 编程模型:MapReduce 仅提供 Map 和 Reduce 两个原语;Spark 提供超过 80 种高阶算子,显著降低了复杂数据流水线的编程负担。
  • 生态整合:Spark 在同一引擎内统一批处理、流处理、SQL 分析、机器学习和图计算,避免了 MapReduce 生态中多个独立系统(Hive、Mahout、Storm 等)之间的集成与运维复杂性。

部署模式与运行架构

Spark 应用程序由驱动程序 (Driver) 和执行器 (Executor) 组成。Driver 负责解析用户程序、构建 DAG 并调度任务;Executor 在工作节点上执行具体任务并回报结果。Spark 支持多种集群管理器:

  1. Standalone:Spark 自带的内置集群管理器,适用于开发和小规模部署。
  2. Hadoop分布式文件系统 YARN:利用 Hadoop 集群的资源管理能力,是企业环境中最常见的部署模式。
  3. Apache Mesos:通用集群管理器,支持多种框架共享资源。
  4. Kubernetes:Spark 3.0 起正式支持,面向云原生部署。

惰性求值与优化

Spark 的惰性求值不仅是性能优化手段,更是调度与容错的基石。当用户调用一个 Action 时,Spark 的 DAG 调度器首先分析所有 Transformation 构成的依赖图,识别出可以流水线执行的窄依赖 (Narrow Dependency) 阶段与需要跨节点 Shuffle 的宽依赖 (Wide Dependency) 阶段,然后将执行计划分解为多个 Stage 依次提交。在执行前,Catalyst 优化器(针对 DataFrame/Dataset)和 Tungsten 执行引擎进一步应用谓词下推、列式存储、代码生成等优化技术,将执行效率推向接近裸硬件的极限。

应用场景与局限

Spark 广泛应用于精准营销中的用户画像构建、金融领域的风控模型训练与实时欺诈检测、物联网传感器数据流的实时聚合、基因组序列分析等大规模数据处理场景。然而,Spark 也并非万能:其内存密集型特征对集群内存容量要求较高;微批次流处理在毫秒级延迟需求下不如 Apache Flink 等原生流处理引擎;对于小数据集,Spark 的分布式调度开销可能超过直接单机处理。理解这些权衡是架构选型的核心考量。