Databricks 解析 Apache Spark 与 Apache Flink 该如何选型
Databricks 发文对比 Apache Spark 与 Apache Flink,认为多数团队应选 Spark 统一引擎,其 Real-Time Mode 可把流处理延迟降到毫秒级。
Databricks:Blog·2026-11-14 15:02· 59 分钟前AI 评分56
Apache Spark 与 Apache Flink:该选哪一个?
AI 导读
Databricks 发文对比 Apache Spark 与 Apache Flink,认为多数团队应选 Spark 统一引擎,其 Real-Time Mode 可把流处理延迟降到毫秒级。
正文 · 原文
对多数团队而言,Apache Spark™ 是更好的选择。Spark 在一个引擎上运行批处理 ETL、SQL 分析、机器学习和流处理,而 Real-Time Mode 如今将 Spark 流处理的端到端延迟降至毫秒级。Apache Flink 是流原生引擎,适合专门的事件处理工作负载,但选择它通常意味着要在 Spark 之外再运行一个引擎。
过去,延迟差距是团队引入 Flink 的主要原因。有了 Real-Time Mode,这一原因基本消失,真正的问题变成:你想构建、运维和治理多少个引擎。
Apache Spark 与 Apache Flink 有什么区别?
Spark 是面向批处理、流处理、SQL 和 AI 的统一引擎,Flink 则是专门的流处理器。两者都是 Apache Software Foundation 的开源项目,均支持精确一次处理、有状态算子和 SQL API。区别在于范围。
Spark 最初是批处理引擎,后来加入了 Structured Streaming,它将流视为一张不断增长的表。相同的 DataFrame 和 SQL 代码可作为定时批处理作业、微批流或 Real-Time Mode 流运行。Flink 则以流处理为先设计,将批处理视为有界流。
Spark 与 Flink 逐项功能对比如何?
下表按通常决定选择的维度对两个引擎进行比较。
| 维度 | Apache Spark | Apache Flink |
|---|---|---|
| 引擎范围 | 统一:批处理、流处理、SQL、ML 和 AI 数据准备 | 流优先,批处理作为有界流 |
| 流处理延迟 | 微批为秒级,Real-Time Mode 为毫秒级 | 毫秒级 |
| 批处理与大规模 ETL | PB 级批处理的行业默认选择 | 支持,但实践中较少使用 |
| 语言 | Python、SQL、Scala、Java,以及通过 Spark Connect 支持 Go、Rust 和 Swift 客户端 | Java、SQL、Python(PyFlink) |
| 有状态处理 | 聚合、去重、连接、transformWithState、RocksDB 状态存储 | 键控状态、定时器、Flink 2.x 中的分离式状态(ForSt) |
| 复杂事件处理 | 使用 transformWithState 的自定义逻辑 | 内置 CEP 库和 SQL MATCH_RECOGNIZE |
| 机器学习与 AI | MLlib、特征管道、SQL 中的向量搜索、LLM 数据准备 | 原生 ML 能力有限,通常需搭配其他系统 |
| 湖仓集成 | 原生读写 Delta Lake 和 Apache Iceberg | 提供 Iceberg 及其他格式的连接器 |
| 托管选项 | Databricks、AWS EMR 和 Glue、Google Cloud、Microsoft Fabric | AWS、Confluent、Ververica 等 |
表 1. Apache Spark 与 Apache Flink 对比。来源:Apache Spark Real-Time Mode 文档、Apache Flink 2.0 发布 和 Flink CEP 文档。
Spark 的流处理比 Flink 更快吗?
在 Databricks 公布的基准测试中,Spark Real-Time Mode 在无状态工作上与 Flink 持平,在有状态聚合和流-静态连接上 p99 延迟更低。基准测试代码公开,使用源自客户的特征计算工作负载,以每秒 10,000 条记录运行 30 分钟,测量 Kafka 输入到输出的延迟。Databricks 将结果总结为比 Flink 快最多 92%。

| 工作负载 | Spark Real-Time Mode p99 | Apache Flink p99 |
|---|---|---|
| 无状态转换 | 3 ms | 3 ms |
| 有状态聚合 | 14 ms | 45 ms |
| 流-静态连接 | 9 ms | 95 ms |
如何解读这些数字:该基准测试由 Databricks 运行。Spark 运行在 Databricks 上,Flink 运行在 AWS Managed Service for Apache Flink 1.18 上。结果对比的是 Spark 的最差运行与 Flink 的最佳运行。请将这些结果视为针对这些工作负载模式的证据,并在做决定前测试你自己的流水线。
生产环境的结果也印证了同样的结论。MakeMyTrip 曾考虑 Flink,最终选择 Spark Real-Time Mode,以避免引入第二个引擎,并将 P50 延迟降至 44 ms,P99 从一分多钟降至约 500 ms。Coinbase 和 DraftKings 也在生产环境中运行 Real-Time Mode。关于该引擎如何实现这一点,请阅读打破微批处理屏障。
如何在 Spark 中获得类似 Flink 的延迟?
你需要更改触发器。Real-Time Mode 是现有 Structured Streaming 查询上的一个触发器,因此同一份代码无需重写即可在不同延迟层级之间迁移。
Real-Time Mode 需要 update 输出模式,并从 Kafka 或行级 foreach 接收器读取和写入。有状态算子随 Apache Spark 4.3 进入开源版本,并已在 Databricks 上正式可用。在 Databricks 上,它可运行于经典计算或Lakeflow Spark Declarative Pipelines中。完整支持矩阵请参阅Real-Time Mode 参考文档。
何时应选择 Apache Flink 而非 Spark?
对于少数专门的流处理工作负载,Flink 可能更合适。当以下条件大多成立时,可考虑使用它:
- 非常大的键控状态。Flink 2.x 的解耦状态专为远大于本地磁盘的状态而构建。
- 复杂事件处理。你需要使用 Flink CEP 或 SQL MATCH_RECOGNIZE 在事件序列上进行模式匹配。
- 低延迟路径上的事件时间定时器。你的逻辑严重依赖事件时间定时器,而 Spark Real-Time Mode 的 transformWithState 尚不支持该功能。
- 已有的 Flink 平台。你已在生产环境中运行 Flink,且该流不向批处理、SQL 或 ML 供数。
如果该流还向分析、ML 特征或湖仓表供数,Spark 可避免在两个引擎之间重复逻辑、运维和治理。

为什么只运行一个引擎很重要?
每增加一个第二引擎,就会增加第二套代码库、第二套技能组合和第二套治理规则。将 Spark 用于批处理、Flink 用于流处理的团队,往往会把相同的业务逻辑重写两次,并调试两者之间的偏差。
- 一套代码库。相同的 DataFrame 和 SQL 逻辑可作为批处理、微批处理或 Real-Time Mode 运行。
- 一个团队。Python 和 SQL 开发者无需学习新的运行时即可构建实时流水线。
- 一套治理模型。流式表和批处理表在 Unity Catalog 中共享血缘和访问控制。
- 一条通往 AI 的路径。相同的流水线可为训练和在线推理构建 ML 特征,正如 DraftKings 使用 transformWithState 所做的那样。
流水线也可以声明式定义,而非手工连接。Spark Declarative Pipelines 管理流式表的依赖关系和增量刷新。
在 Databricks 上运行 Spark 流处理
Databricks 由 Apache Spark 的原始创建者创立,并将 Real-Time Mode 作为正式可用功能运行,包括有状态算子和 transformWithState。它增加了 Lakeflow Spark Declarative Pipelines、Unity Catalog 治理和无服务器管道。为开源 Spark 编写的代码可在 Databricks 上原样运行。要开始使用,请遵循 Apache Spark 教程:Real-Time Mode。
常见问题
Apache Spark 比 Apache Flink 更快吗?
在 Databricks 发布的基准测试中,Spark Real-Time Mode 在无状态工作负载上与 Flink 持平,并在有状态聚合和流-静态连接上具有更低的 p99 延迟。结果取决于工作负载,因此请对您自己的管道进行基准测试。
Spark Streaming 仍然是微批处理吗?
不完全是。Spark Structured Streaming 默认采用微批处理,而 Real-Time Mode 以毫秒级延迟连续处理记录。您可以通过设置触发器为每个查询进行选择。
如果我已经使用 Spark,还需要 Flink 吗?
对于大多数工作负载,不需要。Real-Time Mode 在您用于批处理、SQL 和 ML 的同一引擎上为 Spark 提供毫秒级延迟,因此您只需运行一个系统而不是两个。
什么时候 Flink 是更好的选择?
Flink 可以适合专门的工作负载,例如非常大的键控状态、复杂事件处理,或者已经为独立流运行 Flink 平台的团队。
我可以将 Flink 作业迁移到 Spark 吗?
可以。大多数 Flink SQL 和 DataStream 逻辑可映射到 Structured Streaming 中的 Spark SQL 和 DataFrames,而 Real-Time Mode 覆盖低延迟路径。从无状态和聚合作业开始,然后将有状态逻辑迁移到 transformWithState。
在 Databricks 上开始使用 Real-Time Mode
来源:Databricks:Blog · databricks.com
来源:RadarAI · aihot.news