Apache Spark是一个开源统一分析引擎,用于大规模数据处理。它提供了一种编程集群的接口,具有隐式数据并行性和容错能力。Spark最初于2009年在加州大学伯克利分校的AMPLab开发,其代码库于2013年捐赠给Apache软件基金会,此后由该基金会维护。
Spark的架构基础是弹性分布式数据集(RDD),这是一种只读的多重集,数据项分布在一组机器上,并以容错方式维护。DataFrame API作为RDD之上的抽象层发布,随后是Dataset API。在Spark 1.x中,RDD是主要API,但自Spark 2.x起,鼓励使用Dataset API,尽管RDD API并未弃用。RDD技术仍然是Dataset API的基础。
Spark及其RDD于2012年开发,以应对MapReduce集群计算范式的局限性,该范式强制分布式程序采用线性数据流结构。MapReduce程序从磁盘读取输入数据,对数据应用映射函数,归约结果,并将归约结果存储到磁盘。Spark的RDD充当分布式程序的工作集,提供了一种刻意受限的分布式共享内存形式。
在Spark内部,工作流被管理为有向无环图(DAG)。节点表示RDD,边表示对RDD的操作。Spark支持迭代算法(在循环中多次访问数据集)以及交互式或探索性数据分析(如重复的数据库式查询)。与Apache Hadoop MapReduce实现相比,此类应用程序的延迟可能降低几个数量级。迭代算法包括机器学习系统的训练算法,这构成了开发Spark的最初动力。
Spark Core
Spark Core是整个项目的基础。它提供分布式任务调度、调度和基本I/O功能,通过面向Java、Python、Scala、.NET和R的应用程序编程接口暴露,以RDD抽象为核心。Java API可用于其他JVM语言以及一些可以连接到JVM的非JVM语言(如Julia)。此接口反映了函数式或高阶编程模型:驱动程序通过向Spark传递函数来调用RDD上的并行操作(如map、filter或reduce),Spark在集群上并行调度该函数的执行。这些操作以及连接等其他操作以RDD作为输入并生成新的RDD。RDD是不可变的,其操作是惰性的;容错通过跟踪每个RDD的血统(生成它的操作序列)来实现,以便在数据丢失时重建。RDD可以包含任何类型的Python、.NET、Java或Scala对象。
除了面向RDD的函数式风格外,Spark还提供两种受限形式的共享变量:广播变量引用所有节点上需要的只读数据,而累加器可用于以命令式风格编程归约操作。
RDD中心函数式编程的典型示例是一个Scala程序,它从文本文件计算词频并打印最常见的词。每个map、flatMap和reduceByKey接受一个匿名函数,该函数对单个数据项(或一对项)执行简单操作,并将其应用于将RDD转换为新的RDD。
PySpark
PySpark是Apache Spark的Python API,于2013年2月发布的Spark 0.7中引入。它允许用Python编写Spark应用程序,并提供交互式shell用于探索性分析。PySpark代码在标准CPython运行时下执行,可以调用原生Python库(如NumPy和SciPy);Python用户代码与Spark基于JVM的核心之间的通信历来由Py4J库中介。
PySpark为Spark的大多数组件提供Python接口,包括Spark Core、Spark SQL和DataFrame API、Structured Streaming和MLlib;自Spark 4.1起,它还暴露了Spark Declarative Pipelines API。一个与pandas兼容的API,称为pandas API on Spark,在2021年10月发布的Apache Spark 3.2.0中集成到PySpark中。它提供了与pandas数据分析API等效的功能,这些功能在Spark引擎上执行,允许在分布式数据上运行pandas风格的代码。该组件起源于Koalas,这是Databricks于2019年开源的一个独立项目,随后合并到PySpark中。PySpark还提供了Spark Connect的客户端,这是一种客户端-服务器架构,支持从PySpark应用程序远程连接到Spark集群。
典型的PySpark程序使用SparkSession将数据加载为DataFrame并应用转换。
Spark SQL
Spark SQL是Spark Core之上的一个组件,引入了称为DataFrames的数据抽象,支持结构化和半结构化数据。Spark SQL提供了一种领域特定语言(DSL),用于在Scala、Java、Python或.NET中操作DataFrames。它还提供SQL语言支持,带有命令行接口和ODBC/JDBC服务器。尽管DataFrames缺乏RDD提供的编译时类型检查,但自Spark 2.0起,强类型Dataset也完全受Spark SQL支持。
Spark Declarative Pipelines
Spark Declarative Pipelines(SDP)是一个声明式框架,用于定义和运行提取、转换、加载(ETL)数据管道,于2025年12月16日发布的Apache Spark 4.1.0中添加。开发人员声明管道处理的数据集和要应用的转换,使引擎能够优化执行。该框架旨在通过减少样板代码和实现更好的优化机会来简化管道开发和维护。
集群管理和存储
Spark需要集群管理器和分布式存储系统。对于集群管理,Spark支持独立的原生Spark、Hadoop YARN、Apache Mesos或Kubernetes。独立的原生Spark集群可以手动启动,也可以使用安装包提供的启动脚本启动。也可以在单台机器上运行守护进程进行测试。对于分布式存储,Spark可以接口各种分布式系统,包括Alluxio、Hadoop分布式文件系统(HDFS)、MapR文件系统(MapR-FS)、Cassandra、OpenStack Swift、Amazon S3、Kudu、Lustre文件系统或自定义解决方案。Spark还支持伪分布式本地模式,通常仅用于开发或测试,其中不需要分布式存储,可以使用本地文件系统;在这种情况下,Spark在单台机器上运行,每个CPU核心有一个执行器。
Spark处理批处理和流式工作负载的能力,加上其内存处理和丰富的API,使其成为大规模数据处理的流行选择,应用行业从金融到云计算。它与Apache Kafka的流式数据集成以及与Apache Airflow的工作流编排进一步扩展了其在现代数据管道中的实用性。