生而为人

程序员的自我修养

0%

[toc]

Spark vs Flink 技术选型(面试满分版 + 业务场景怎么选)

一、核心本质区别(先记这句)

  • Spark微批处理,离线计算之王,批量吞吐强、成本低
  • Flink原生流处理,实时计算之王,低延迟、事件时间、Exactly-Once、水位线窗口完善

二、关键维度对比表(直接背)

表格

对比维度 Spark Flink
计算模型 微批、离线为主 纯流式、事件驱动
延迟 分钟级、小时级 毫秒 / 秒级低延迟
时间语义 处理时间为主,事件时间弱 事件时间完善,水位线、乱序处理强
一致性 勉强支持 Exactly-Once 原生支持 Exactly-Once
窗口能力 简单窗口,迟到处理弱 滚动 / 滑动 / 会话 / 迟到数据全套支持
吞吐能力 超高吞吐,适合海量批量 吞吐不错,略低于 Spark 批处理
容错机制 血统依赖、重算整个分区 Checkpoint + 状态增量快照,细粒度容错
状态管理 弱,依赖外部存储 原生状态后端(RocksDB)、TTL、增量 CK
开发成本 SQL 友好,上手简单 API 稍复杂,实时场景功能更全
资源开销 批量调度资源利用率高 常驻任务,资源长期占用
小文件 容易产生,需手动合并 可窗口攒批 + 文件滚动策略控制

三、坚决选 Spark 的场景

  1. 离线数仓全链路(Hive 数仓分层、日 / 小时级调度)
  2. 海量数据批量清洗、迁移、大表全量计算
  3. 离线报表、离线指标、用户画像离线标签
  4. 数据量大、不要求低延迟、追求低成本高吞吐
  5. 历史数据回溯、批量重跑、大规模离线 ETL
  6. 团队以 SQL 开发为主、追求简单易维护
  1. 实时数仓、实时大屏、实时指标
  2. 实时特征计算、推荐 / 广告实时数据流
  3. Kafka 实时消费、乱序日志、需要事件时间精准窗口
  4. 要求低延迟(秒级甚至毫秒级)
  5. 需要严格 Exactly-Once、不丢不重
  6. 状态长期存储、窗口计算、迟到数据兜底
  7. 实时风控、实时告警、行为实时分析

五、折中场景怎么选

  1. 准实时(5~10 分钟延迟)

    可用 Spark Streaming,但现在业界更倾向直接上 Flink,统一流批引擎。

  2. 流批一体架构

    直接用 Flink 流批统一,一套代码跑实时 + 离线,不用维护两套引擎。

  3. 数据湖 Hudi/Iceberg

    写入、增量消费 Flink 更适配;离线分析 Spark 更强。

六、面试标准口述回答(直接背)

技术选型主要看延迟要求、业务场景、数据量级、一致性诉求

离线批量、海量 ETL、日级小时级数仓、高吞吐低成本场景选 Spark

低延迟实时计算、实时大屏、实时特征、乱序日志、事件时间窗口、要求精确一次语义的场景选 Flink

现在主流架构采用Flink 流批一体,实时离线一套引擎统一开发,离线分析依然用 Spark 做大规模批量查询和报表。

七、最简选型口诀

离线批量、数仓报表 → 选 Spark

实时低延迟、窗口乱序、精准一次 → 选 Flink

流批一体统一架构 → 全站 Flink,离线分析保留 Spark

Spark vs Flink 面试必问 10 道(标准满分答案 直接背)

1. 底层计算模型有什么本质区别?

:Spark 是微批计算,把流拆成小批量离线任务跑;

Flink 是原生流式计算,一条一条事件持续处理,是真正的流引擎。

2. 延迟对比?

:Spark 分钟级、小时级,适合离线;

Flink 毫秒 / 秒级低延迟,适合实时大屏、实时指标。

3. 时间语义谁更强?

:Flink 强很多,原生支持 EventTime 事件时间、Watermark 水位线、迟到数据处理

Spark 偏向处理时间,事件时间、乱序支持较弱。

4. 窗口功能对比?

:Flink 窗口完备:滚动、滑动、会话、全局窗口,支持水位线 + 允许迟到 + 侧输出兜底;

Spark 窗口简单,对乱序、晚到数据处理能力差。

5. 数据一致性 Exactly-Once 谁更好?

:Flink 原生 Checkpoint + 状态后端,天然支持 Exactly-Once;

Spark 只能靠业务幂等、事务兜底,引擎层面支持不彻底。

6. 状态管理能力对比?

:Flink 内置 RocksDB 状态后端、TTL 过期、增量 Checkpoint,适合长期驻留任务;

Spark 无原生状态,状态只能存在内存或外部存储,不适合复杂实时聚合。

7. 容错机制区别?

:Spark 基于 RDD 宽窄依赖血统重算,失败重算整个分区;

Flink 基于 Checkpoint 快照,只恢复失败节点最近状态,粒度更细、开销更小。

8. 吞吐和资源开销对比?

:Spark 批量调度,吞吐更高、资源利用率好、成本低,适合海量离线;

Flink 任务常驻集群,资源长期占用,吞吐略低于 Spark 批处理。

9. 处理乱序、迟到数据谁更强?

:Flink 靠水位线推进时间,三层处理:水位线等待 + 允许迟到 + 侧输出兜底;

Spark 对乱序不友好,很难保证时间窗口精度。

10. 实际项目怎么技术选型?

离线数仓、批量 ETL、历史回溯、日 / 小时级报表、海量高吞吐低成本 → 选 Spark

实时大屏、实时特征、实时风控、乱序日志、要求低延迟 + 精确一次 → 选 Flink

流批一体架构统一用 Flink 做实时 + 离线,复杂离线分析保留 Spark。

Spark Streaming / Structured Streaming / Flink 三者终极对比(面试直接背)

一、核心模型一句话

  1. Spark Streaming纯微批,固定时间切分批次,老旧 API,已淘汰。
  2. Spark Structured Streaming默认微批,API 封装成流,底层还是批次触发;仅 Continuous 模式是真流但生产不用。
  3. Flink原生事件驱动流,来一条处理一条,不是微批。

二、三者对比总表

表格

框架 计算模型 延迟 时间语义 窗口 / 乱序 状态管理 生产常用
Spark Streaming 固定间隔微批 秒~分钟级 处理时间 弱、不支持乱序 无原生状态 已淘汰
Spark Structured Streaming 默认微批;Continuous 真流 百 ms~ 秒级 一般支持事件时间 一般,水位线偏弱 有状态但偏弱 准实时、简单实时
Flink 原生流式事件驱动 毫秒~秒级 完善 EventTime 水位线 + 迟到 + 侧输出全套 原生 RocksDB+TTL + 增量 CK 高可用复杂实时首选

三、关键细节区别(面试必问)

1. Spark Streaming

  • 基于 DStream
  • 按批次间隔(如 1s、5s)切分数据
  • 没有完善事件时间、水位线
  • 不推荐新项目,已过时

2. Spark Structured Streaming

  • 基于 DataFrame/Dataset,统一 SQL 编程
  • 底层Trigger 触发微批,轮询 Kafka
  • 也支持 EventTime、窗口,但乱序、水位线能力远不如 Flink
  • 有状态,但无 RocksDB、TTL 能力弱
  • 适合简单准实时,不适合复杂乱序、长期状态任务
  • 真正事件驱动,不是轮询微批
  • 完美支持 Watermark+EventTime + 迟到数据三层处理
  • 原生状态后端、RocksDB、增量 CK、状态 TTL
  • 低延迟、Exactly-Once、复杂窗口、实时特征首选

四、延迟层级排序

Flink (毫秒级 10ms) < Structured Streaming (百毫秒 100ms) < Spark Streaming (秒级 1000ms+)

五、面试标准口述版

Spark Streaming 是老旧固定微批已淘汰;

Structured Streaming 虽然 API 是流式,默认底层依旧微批轮询触发,延迟和乱序处理能力有限;

Flink 是原生事件驱动流式,支持完善的事件时间、水位线、迟到数据和原生状态管理,低延迟、一致性更好,复杂实时业务优先选 Flink。

六、选型口诀

简单准实时、熟悉 Spark 生态 → 用 Structured Streaming

低延迟、乱序严重、窗口精准、长期状态 → 必选 Flink

老项目 Spark Streaming 直接废弃重构

Spark Structured Streaming是微批处理吗

一句话结论

Spark Structured Streaming 默认还是微批,但从架构设计上伪装成了 “流式”,不是真正的事件逐条处理;只有开启 Continuous 模式才是真正低延迟流。

1. 普通默认模式 —— 依然是微批

Spark Structured Streaming 底层依旧是按固定间隔生成 Batch

每隔一段时间触发一次 Job,批量处理这段时间的数据。

  • 本质:微批调度
  • 延迟:百毫秒~秒级
  • 缺点:没法做到毫秒级超低延迟,没有真正的事件驱动
  • Flink:事件驱动,来一条处理一条,原生流式
  • Spark Structured Streaming:架构包装成流,底层还是微批轮询触发

3. Spark 有没有真正流式?

有,但极少用:

Continuous 连续处理模式

1
spark.sql.streaming.continuous.execution.enabled=true
  • 不再走微批
  • 长驻线程持续拉取数据
  • 延迟可到 毫秒级
  • 缺点:稳定性差、功能阉割、生产基本不用

4. 面试标准口述(直接背)

Spark Structured Streaming 默认底层仍是微批处理,按照固定时间间隔生成批次任务执行,并不是像 Flink 那样事件驱动的原生流式;

虽然 API 设计成流式编程模型,但调度引擎还是微批。只有开启 Continuous 连续模式才是真正低延迟流,但生产稳定性不足,一般不用。

5. 最简总结

  • 默认 SSS = 微批
  • Flink = 原生流
  • SSS Continuous 模式 = 真流,但生产不用