技术深度剖析
Apache Spark 的架构天才之处在于其 DAG(有向无环图)调度器。与 Hadoop MapReduce 强制采用僵化的两阶段 map-then-reduce 管道并频繁进行磁盘 I/O 不同,Spark 将逻辑执行计划构建为一个由多个阶段组成的 DAG。每个阶段包含一组并行任务,这些任务可以在分区之间进行流水线处理,从而最大限度地减少数据混洗和物化。弹性分布式数据集(RDD) 是基础抽象——一个不可变的、分区的记录集合,可以并行操作。RDD 跟踪血统信息,允许 Spark 在无需复制的情况下重新计算丢失的分区,这是相对于传统检查点机制的关键容错优势。
内存管理 是 Spark 真正闪耀但也容易绊倒的地方。Spark 使用统一内存管理器,将 JVM 堆分为执行内存(用于混洗、连接、聚合)和存储内存(用于缓存 RDD)。默认比率为 0.6 用于执行,0.4 用于存储,但可以通过 `spark.memory.fraction` 进行调整。当执行内存不足时,Spark 会溢出到磁盘,这可能导致性能下降数个数量级。Spark 2.0 中引入的 Tungsten 项目通过使用堆外内存和缓存感知算法绕过了 JVM 对象开销,在某些操作上实现了接近硬件级别的效率。Tungsten 的 `UnsafeRow` 格式降低了序列化成本,而全阶段代码生成将查询计划编译为优化的 Java 字节码。
Structured Streaming 代表了 Spark 从微批处理到近实时处理的演进。它将流数据视为一张无界表,使用与批处理相同的 DataFrame/Dataset API。在底层,它使用 连续处理模式(自 Spark 2.3 起),通过一个长时间运行的任务持续处理记录,而不是进行微批处理,从而实现亚毫秒级延迟。然而,默认的微批处理模式(延迟约 100ms)在精确一次语义方面仍然更加稳健。
性能基准测试 讲述了一个微妙的故事。下表比较了 Spark 3.5.1、Apache Flink 1.18 和 DuckDB 0.10 在 16 节点集群(每个节点:32 核,128 GB RAM)上运行标准 TPC-H 类工作负载(100 GB 规模因子)的表现:
| 引擎 | 查询 1 (扫描/过滤) | 查询 3 (连接/聚合) | 查询 6 (聚合) | 查询 9 (复杂连接) | 内存使用量 (峰值) |
|---|---|---|---|---|---|
| Apache Spark 3.5.1 | 12.3s | 45.2s | 8.1s | 89.7s | 240 GB |
| Apache Flink 1.18 | 14.1s | 38.9s | 9.4s | 72.3s | 210 GB |
| DuckDB 0.10 (单节点) | 2.1s | 18.7s | 1.4s | 34.2s | 45 GB |
数据要点: Spark 在扫描密集型工作负载中占据主导地位,这得益于其优化的 Parquet 读取器和全阶段代码生成,但 Flink 凭借其有状态流处理模型,在复杂连接方面略胜一筹。DuckDB 虽然是单节点,但通过利用向量化执行和列式存储,在所有查询上均优于两者——这提醒我们,对于低于 100 GB 的数据集,Spark 的分布式开销是不必要的。
对于关注前沿技术的读者来说,Apache Spark GitHub 仓库(github.com/apache/spark)仍然是权威来源。最近的提交显示,Spark Connect(一种用于远程执行的解耦客户端-服务器协议)和 自适应查询执行(AQE) 的改进正在积极开发中,后者可以根据运行时统计信息动态合并混洗分区并优化连接策略。NVIDIA 的 `spark-rapids` 插件也日益流行,它能够为 ETL 和 ML 工作负载提供 GPU 加速处理,在兼容硬件上报告了 3-5 倍的加速效果。
关键参与者与案例研究
Databricks 是 Spark 生态系统中的 800 磅大猩猩。由 Spark 的原始创建者(Matei Zaharia、Ion Stoica、Patrick Wendell、Reynold Xin 等人)创立,Databricks 已筹集超过 35 亿美元(截至 2024 年),估值达到 430 亿美元。他们的 Databricks Lakehouse Platform 将 Spark 与 Delta Lake(数据湖上的 ACID 事务)、MLflow(ML 生命周期管理)和 Unity Catalog(治理)集成在一起。Databricks 的策略是通过 Serverless SQL Warehouses 和 Auto-scaling Clusters 抽象掉集群管理,从而减轻困扰本地 Spark 部署的运维负担。然而,这是有代价的——Databricks 的定价可能比原始云基础设施高出 2-3 倍,导致一些企业探索替代方案。
Amazon EMR 和 Google Cloud Dataproc 是各自云上的主要托管 Spark 服务。Amazon EMR 拥有最大的市场份额(估计占托管 Spark 工作负载的 40%),但其 Spark 版本落后于 Databricks 优化运行时 6-12 个月。Google Cloud Dataproc 提供与 BigQuery 和 Vertex AI 的无缝集成,但其 Spark 性能常因 YARN 配置默认值不理想而受到批评。
Cloudera(在 CDP 合并后现已成为 Qualtrics 的一部分)继续