跳到正文
RadarAI· Databricks:Blog(RSS)·· 23 小时前AI 评分41

Databricks 解析 Apache Spark 与 Apache Flink 该如何选型

AI 导读

Databricks 发文对比 Apache Spark 与 Apache Flink,认为多数团队应选 Spark 统一引擎,其 Real-Time Mode 可把流处理延迟降到毫秒级。

正文 · AI 翻译

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 SparkApache Flink
引擎范围统一:批处理、流处理、SQL、ML 和 AI 数据准备流优先,批处理作为有界流
流处理延迟微批为秒级,Real-Time Mode 为毫秒级毫秒级
批处理与大规模 ETLPB 级批处理的行业默认选择支持,但实践中较少使用
语言Python、SQL、Scala、Java,以及通过 Spark Connect 支持 Go、Rust 和 Swift 客户端Java、SQL、Python(PyFlink)
有状态处理聚合、去重、连接、transformWithState、RocksDB 状态存储键控状态、定时器、Flink 2.x 中的分离式状态(ForSt)
复杂事件处理使用 transformWithState 的自定义逻辑内置 CEP 库和 SQL MATCH_RECOGNIZE
机器学习与 AIMLlib、特征管道、SQL 中的向量搜索、LLM 数据准备原生 ML 能力有限,通常需搭配其他系统
湖仓集成原生读写 Delta Lake 和 Apache Iceberg提供 Iceberg 及其他格式的连接器
托管选项Databricks、AWS EMR 和 Glue、Google Cloud、Microsoft FabricAWS、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%。

Bar chart of p99 latency: stateless 3 ms for both engines, aggregation 14 ms for Spark versus 45 ms for Flink, and stream-static join 9 ms for Spark versus 95 ms for Flink.
图 2. 每秒 10,000 条记录时的 p99 端到端延迟。Spark Real-Time Mode 展示其最差运行结果,Flink 展示其最佳运行结果。
工作负载Spark Real-Time Mode p99Apache Flink p99
无状态转换3 ms3 ms
有状态聚合14 ms45 ms
流-静态连接9 ms95 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 可避免在两个引擎之间重复逻辑、运维和治理。

Decision flowchart: if streaming data also feeds batch, SQL or ML, use Apache Spark. For standalone streams, use Spark micro-batch or Real-Time Mode, with Flink as a niche fit for very large state or complex event processing.
图 3. 在 Apache Spark 与 Apache Flink 之间做选择的决策指南。

为什么只运行一个引擎很重要?

每增加一个第二引擎,就会增加第二套代码库、第二套技能组合和第二套治理规则。将 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