3. 核心技术选型:Flink vs Spark Streaming、Kafka vs Pulsar、Hudi vs Iceberg vs Delta Lake
做流批一体架构,最头疼的就是选型。我见过不少团队,一上来就追新,结果被坑得够呛。这一章,我把几个核心组件的选型思路掰开揉碎讲清楚。
说白了,选型没有银弹。你得根据自己团队的技术栈、数据规模、实时性要求来权衡。我习惯把选型分成三层来看:计算引擎、消息队列、存储层。咱们一层一层聊。
3.1 计算引擎:Flink vs Spark Streaming
这两个是绕不开的对手。我两个都用过,踩过不少坑。先看一张对比图,心里有个底。
3.1.1 Flink 的优势
Flink 的设计哲学就是「流是一切」。它把批当成有界流来处理。这个思路,在做 API 数据服务时特别有用。
我记得有个项目,需要实时聚合用户行为数据,然后通过 API 对外暴露。用 Flink 的 DataStream API,配合 Event Time 和 Watermark,延迟控制在 2 秒以内。如果用 Spark Streaming,微批次间隔至少 5 秒,用户体验就差一截。
3.1.2 Spark Streaming 的适用场景
别把 Spark Streaming 一棍子打死。如果你的场景是「准实时」——比如延迟容忍度在 1 分钟以上,那 Spark 的生态优势就体现出来了。
我曾经帮一个客户做数据湖项目,他们用 Spark 做批处理,偶尔需要跑一些流任务。这种情况下,统一用 Spark 比引入 Flink 更划算。毕竟团队不用学两套东西。
3.2 消息队列:Kafka vs Pulsar
消息队列是流批一体的「血管」。数据从源头到计算引擎,全靠它。我最早用 Kafka,后来接触 Pulsar,各有千秋。
3.2.1 Kafka 的统治地位
Kafka 的生态太强了。Flink、Spark、Hudi、Iceberg 全都原生支持 Kafka。你几乎找不到一个不支持 Kafka 的流处理框架。
我有个项目,每天处理 10 亿条消息,Kafka 集群 30 个节点,稳如老狗。但有个痛点:扩缩容太麻烦。每次加节点,要重新平衡分区,搞不好还会影响线上服务。
3.2.2 Pulsar 的后发优势
Pulsar 的存算分离架构,天生适合云原生。它的 BookKeeper 做存储,Broker 做计算,扩缩容跟玩似的。
我记得有个客户,业务增长快,Kafka 集群扩了又扩,每次都要停机。后来换成 Pulsar,加节点就像加 Pod 一样简单。而且 Pulsar 的分层存储,能把冷数据自动迁移到 S3,省钱又省心。
3.3 存储层:Hudi vs Iceberg vs Delta Lake
存储层是流批一体的「地基」。这三个都是表格式(Table Format),不是存储引擎。它们解决的是同一个问题:怎么让数据湖支持 ACID、时间旅行、增量查询。
3.3.1 Hudi:增量处理的王者
Hudi 的核心理念是「增量处理」。它支持 Copy-on-Write 和 Merge-on-Read 两种存储类型。前者写放大,后者读放大。
我有个 API 数据服务项目,数据源是 MySQL 的 CDC 流。用 Hudi 的 Merge-on-Read 模式,配合 Flink,实现了秒级的数据同步。API 查询时,直接读 Hudi 的 Parquet 文件,性能杠杠的。
3.3.2 Iceberg:开放的表格式
Iceberg 的设计更「学术派」。它把表格式定义得非常清晰,快照隔离、分区演进、隐藏分区,这些特性让数据湖管理变得优雅。
我记得有个数据湖项目,数据量几百 TB,查询模式多变。用 Iceberg 的分区演进功能,随时调整分区策略,不用重写历史数据。这一点,Hudi 和 Delta Lake 都做不到。
3.3.3 Delta Lake:Databricks 的生态利器
Delta Lake 是 Databricks 的亲儿子。如果你在用 Databricks 平台,那 Delta Lake 是首选。它的 ACID 事务、Schema 强制、性能优化,都是顶级的。
但有个问题:Delta Lake 跟 Spark 绑定太深。如果你用 Flink 做流处理,集成 Delta Lake 会比较麻烦。我见过有人硬搞,结果踩了一堆坑。
3.4 选型决策矩阵
最后,我整理了一个决策矩阵,方便你快速对比。这个矩阵是我多年经验总结的,你可以直接拿来用。
| 场景 | 计算引擎 | 消息队列 | 存储层 |
|---|---|---|---|
| 实时 API 数据服务 | Flink | Kafka / Pulsar | Hudi |
| 准实时数据湖 | Spark | Kafka | Iceberg |
| CDC 增量同步 | Flink | Kafka | Hudi |
| Databricks 生态 | Spark | Kafka | Delta Lake |
| 云原生弹性场景 | Flink | Pulsar | Iceberg |
嗯,这一章的内容就到这里。选型是个动态过程,别指望一次选对。我建议你先做个小规模 PoC,跑通核心链路,再逐步优化。毕竟,实践出真知。