Apache Spark 技术详解

Apache Spark 是一个开源的、** unified(统一的)、内存计算的分布式计算框架**,旨在用于大规模数据处理。它最初由加州大学伯克利分校的 AMPLab 开发,后来在 2010 年开源。

一、核心理念与为什么是“统一的”?

Spark 的核心目标是提供一个统一的平台,用一套技术栈解决所有大数据处理问题。在此之前,用户可能需要使用 MapReduce 进行批处理、Storm 进行流处理、其他工具进行机器学习等,学习成本和运维复杂度极高。

Spark 通过基于 RDD(弹性分布式数据集) 的统一数据抽象,实现了:

  • 批处理(Batch Processing)

  • 流处理(Stream Processing / Structured Streaming)

  • 机器学习(MLlib)

  • 图计算(GraphX)

  • 交互式查询(Spark SQL)

所有这些任务都可以在同一个应用程序中无缝组合,大大简化了大数据应用的开发。


二、与 MapReduce 的对比:为什么更快?

Spark 通常被认为比 Hadoop MapReduce 快 10x - 100x,主要得益于其内存计算和先进的执行模型。

特性Apache MapReduceApache Spark
数据存储中间结果存储在磁盘上,I/O 开销巨大。中间结果优先存储在内存中,极大减少 I/O。
执行模型多阶段任务,每个阶段结束后都要落盘。有向无环图(DAG) 执行引擎,可将多个操作流水线化(pipeline),减少落盘。
编程范式只有 Map 和 Reduce 两种操作,非常刻板。提供了 80+ 种算子(Transformations & Actions),表达能力极强。
容错机制通过数据冗余(多副本)实现容错。通过 RDD 的血缘(Lineage) 实现轻量级容错。

三、核心架构与组件

一个 Spark 应用在集群上运行为一个独立的进程集,由一个驱动程序(Driver Program) 协调。

  1. Spark Runtime (集群管理器)

    • Standalone: Spark 内置的简易集群管理器。

    • Apache Hadoop YARN: 最常用的方式,共享 Hadoop 集群资源。

    • Apache Mesos: 另一种通用的集群管理器。

    • Kubernetes: 云原生的部署方式,是未来的趋势。

  2. 核心组件

    • Driver(驱动程序): 运行 main() 函数,创建 SparkContext,负责将用户代码转换为任务(Tasks),并调度任务到 Executor 上执行。

    • Executor(执行器): 在工作节点(Worker Node)上运行的进程,负责执行 Driver 分配的任务,并将数据存储在内存或磁盘中。每个应用都有自己的一组 Executor。

  3. Spark API & Libraries

    • Spark Core: 提供了核心功能和 API,定义了 RDD(Resilient Distributed Datasets)这一基本抽象。这是所有其他功能的基础。

    • Spark SQL: 用于处理结构化数据(如 JSON, Parquet, Avro, 以及通过 JDBC/ODBC 连接数据库)。它引入了 DataFrame 和 Dataset API,提供了更高级的抽象和优化(Catalyst 优化器)。

    • Spark Streaming: 用于处理实时数据流。它将流数据分解成一系列小的批处理作业(微批处理,Micro-batch)进行处理。

    • Structured Streaming: 基于 Spark SQL 引擎构建的更高级的流处理引擎,提供低延迟、端到端精确一次(exactly-once)的语义保证,是 Spark Streaming 的进化版。

    • MLlib (Machine Learning): 可扩展的机器学习库,提供了常见的算法(分类、回归、聚类、推荐等)和工具(特征提取、管道)。

    • GraphX: 用于图计算和并行图计算的 API。


四、核心抽象:RDD, DataFrame, Dataset
  1. RDD (Resilient Distributed Dataset) - 弹性分布式数据集

    • 是什么: 一个不可变的、可分区的、元素集合的分布式集合。

    • 核心特性:

      • 弹性(Resilient): 通过血统(Lineage) 实现容错。如果某个分区的数据丢失,Spark 可以根据血统(记录了如何从其他 RDD 转换而来)重新计算该分区,而无需备份。

      • 分布式(Distributed): 数据分布在不同节点的内存中。

      • 数据集(Dataset): 一个只读的数据集合。

    • 操作类型:

      • 转换(Transformations): 惰性操作,从一个 RDD 生成一个新的 RDD(如 map, filter, join)。它们只记录转换关系,并不立即计算。

      • 动作(Actions): 触发实际计算的操作,会向 Driver 返回结果或向外部存储写入数据(如 count, collect, saveAsTextFile)。

  2. DataFrame & Dataset

    • DataFrame: 等同于一个分布式的二维表格,带有模式(Schema)(即列名和类型)。类似于 Python Pandas 的 DataFrame 或 R 的 data.frame,但底层经过 Catalyst 优化器和 Tungsten 执行引擎的深度优化,性能远超 RDD。

    • Dataset: 在 Scala 和 Java API 中,是强类型的 DataFrame。它提供了面向对象的编程接口和类型安全。

    • 优势: 相比于 RDD,DataFrame/Dataset API 性能更高,因为 Spark 可以理解数据的结构(Schema),从而进行全局优化(如谓词下推、列式存储读取)。

总结: 现代 Spark 开发应优先使用 DataFrame/Dataset API,只有在需要极底层的控制时才使用 RDD API。


五、工作流程与核心原理
  1. DAG 与执行计划

    • 当你在 Driver 中调用一个 Action(如 df.count())时,Spark 会:

      1. 逻辑计划(Logical Plan): 根据代码中的转换操作,构建一个逻辑执行计划(DAG)。

      2. 优化(Optimization): Catalyst 优化器对逻辑计划进行优化(如合并连续的 filter、选择最优的 join 策略)。

      3. 物理计划(Physical Plan): 将优化后的逻辑计划转换为可以在集群上执行的物理计划(具体任务)。

      4. 调度与执行(Scheduling & Execution): 将任务(Tasks)分发到各个 Executor 上并行执行。

  2. Tungsten 执行引擎

    • 这是 Spark 性能飞跃的关键。它绕过了 JVM 的对象模型和 GC 开销,直接操作二进制数据在堆外内存(Off-Heap Memory)中,并采用全阶段代码生成(Whole-Stage Code Generation) 技术将整个查询编译成优化的机器码,而非一步步执行算子。


六、优缺点分析
优点缺点
极致的速度: 内存计算和高级优化使其非常快。内存消耗: 对内存容量要求高,配置不当易导致 OOM(内存溢出)。
易于使用: 支持 Java, Scala, Python, R,提供丰富的 API。“小黑盒”: 高级 API 隐藏了细节,调优和理解底层行为有时较困难。
通用性: 一站式解决批处理、流处理、机器学习等多种任务。流处理延迟: 微批处理(Micro-batch)架构使其在流处理上的延迟高于 Flink 等真正的流引擎。
强大的生态系统和社区支持。成本: 为了获得极致性能,需要投入更多硬件资源(尤其是内存)。

七、典型应用场景
  1. 大规模 ETL (提取、转换、加载): 从各种数据源(HDFS, S3, Kafka, DB)提取数据,进行清洗、转换,最后加载到数据仓库(如 Hive)中。这是最常见的场景。

  2. 实时流处理: 处理网站事件流、监控日志、实时推荐(使用 Structured Streaming)。

  3. 机器学习: 训练和部署大规模的机器学习模型(如用户画像、欺诈检测)。

  4. 交互式数据分析: 数据科学家和分析师使用 Spark SQL 和 Notebook(如 Jupyter, Zeppelin)对海量数据进行即席查询(Ad-hoc Query)。

总结

Apache Spark 通过其内存计算、统一的编程模型和先进的执行引擎,彻底改变了大数据处理的面貌。它极大地提升了开发效率和计算性能,成为了大数据领域事实上的标准计算框架。尽管在纯流处理极致低延迟方面面临 Apache Flink 的挑战,但其在批处理、交互式查询和机器学习方面的综合优势依然无可替代。对于任何从事大数据相关工作的人来说,Spark 都是一项必须掌握的核心技能。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐