4. 数据计算层设计:批处理、流处理与OLAP引擎

数据计算层,说白了就是整个平台的「发动机」。数据进了湖,怎么算、怎么查、怎么快,全看这一层。我这些年做过的金融项目,踩坑最多的也是这里。今天咱们就聊聊批处理、流处理和OLAP引擎这三块,怎么选、怎么搭。

4.1 批处理:Spark还是Flink Batch?

批处理,金融场景里最常见的需求——日终跑批、报表生成、历史数据回溯。我习惯把批处理比作「夜间工厂」,白天不干活,晚上拼命算。

Spark Batch 是老牌选手了。我记得2018年做某券商的数据平台,每天凌晨2点跑批,处理200亿条交易记录。Spark的DAG调度和内存计算,确实快。但有个坑——数据倾斜。某个热门股票的交易量是其他股票的100倍,结果一个task跑死,其他task闲着。解决方案?加盐、重分区、或者用Adaptive Query Execution(AQE)。

我的建议:如果批处理任务量大、对延迟不敏感(小时级),Spark Batch依然是首选。生态成熟,社区活跃,坑都被人踩过了。

Flink Batch 是后来者。Flink本质上是个流处理引擎,但它的批处理模式(Batch on Flink)也做得不错。我去年在某个项目中试过,用Flink跑T+1的报表,发现它比Spark更省资源——因为Flink的算子链优化做得更好。但说实话,Flink的批处理生态不如Spark,比如Hive on Flink就不如Spark SQL成熟。

维度 Spark Batch Flink Batch
成熟度 ★★★★★ ★★★☆☆
资源利用率 ★★★☆☆ ★★★★☆
SQL支持 ★★★★★ ★★★★☆
数据倾斜处理 ★★★★☆(AQE) ★★★☆☆
避坑指南:我曾经在一个项目中,用Spark跑批,结果OOM了。后来发现是shuffle时数据量太大,默认的200个分区不够。调大分区数,问题解决。记住:分区数 = 数据量 / 200MB,这个经验值很管用。

4.2 流处理:Flink还是Spark Streaming?

流处理,金融场景的刚需——实时风控、实时指标、实时大屏。你想想看,用户刚下了一笔大额转账,系统必须在毫秒级判断是不是洗钱。这时候批处理就歇菜了,得上流处理。

Flink 是我现在的主力。为什么?因为它有真正的「事件时间」语义。我记得做某支付公司的实时风控时,用户手机网络延迟,事件晚到了10秒。如果用Spark Streaming,这10秒的数据就丢了。但Flink的Watermark机制,能等一等迟到的数据。嗯,这里要注意:Watermark设置太短,丢数据;太长,延迟高。我一般设成「最大延迟时间 + 500ms」。

Spark Streaming 本质上是微批处理。它把流切成一个个小批次(比如1秒一个批次),然后跑批处理逻辑。好处是跟Spark Batch无缝衔接,坏处是延迟高(秒级),而且处理不了乱序数据。我见过有人用Spark Streaming做实时风控,结果因为数据乱序,误判率高了10%。

警告:如果你需要「精确一次」语义(Exactly-Once),Flink是唯一选择。Spark Streaming的微批模式,在故障恢复时可能重复处理数据。金融场景里,重复处理意味着重复扣款,这谁受得了?

我个人的经验是:实时风控、实时指标用Flink;实时大屏、简单ETL用Spark Streaming。前者要求高,后者够用就行。

4.3 OLAP引擎:ClickHouse还是Doris?

OLAP引擎,说白了就是「查得快」。批处理算完了,流处理也实时更新了,数据存哪?怎么查?这就是OLAP引擎的活。

ClickHouse 是我最早用的。2019年做某银行的用户画像系统,每天查询量上亿次。ClickHouse的列式存储和向量化执行,确实快。单表查询,秒级响应。但有个问题——多表Join性能差。我试过用ClickHouse做星型模型查询,结果慢得离谱。后来改用宽表,才解决问题。

我的建议:ClickHouse适合「大宽表 + 单表查询」的场景。比如用户行为分析、日志分析、监控指标。如果你需要频繁Join,慎用。

Doris 是后来崛起的。我去年在某个项目中,用Doris替换了ClickHouse。为什么?因为Doris的多表Join性能好。它用的是MPP架构,支持Hash Join和Broadcast Join。我测试过,10亿条事实表Join 1000万条维度表,Doris只要3秒,ClickHouse要15秒。而且Doris支持标准SQL,对分析师更友好。

维度 ClickHouse Doris
单表查询 ★★★★★ ★★★★☆
多表Join ★★☆☆☆ ★★★★★
SQL兼容性 ★★★☆☆ ★★★★★
运维复杂度 ★★★☆☆ ★★★★☆
避坑指南:我曾经用ClickHouse做实时写入,结果发现写入速度越来越慢。后来一查,是MergeTree的合并策略问题。解决方案:控制分区数,每个分区不超过10GB。Doris也有类似问题,但它的分桶机制更灵活。

4.4 整体架构图

下面这张图,是我在多个项目中沉淀下来的数据计算层架构。你仔细看,批处理、流处理、OLAP引擎是怎么协同的。

数据计算层架构图 数据源 Kafka / 消息队列 / 数据库 流处理 Flink / Spark Streaming 批处理 Spark / Flink Batch OLAP引擎 ClickHouse / Doris 数据湖 HDFS / Iceberg / Hudi 数据流向: 实时数据 -> 流处理 -> OLAP引擎(秒级延迟) 离线数据 -> 数据湖 -> 批处理 -> OLAP引擎(小时级延迟) 💡 建议:流处理结果写入OLAP引擎,批处理结果也写入OLAP引擎,统一查询入口

这张图的核心逻辑是:流处理负责实时数据,批处理负责离线数据,OLAP引擎统一对外提供查询服务。我见过很多团队,把流处理和批处理的结果分开存,结果查询时还得拼数据,麻烦得很。统一入口,省心省力。

4.5 选型总结

说了这么多,最后给个总结。你选型时,问自己三个问题:

  1. 数据延迟要求多高? 秒级 -> Flink;分钟级 -> Spark Streaming;小时级 -> Spark Batch。
  2. 查询场景是单表还是多表? 单表 -> ClickHouse;多表 -> Doris。
  3. 团队技术栈是什么? 如果团队熟悉Java/Scala,选Flink;熟悉Python/SQL,选Spark。
我的经验:金融场景里,Flink + Doris 是黄金组合。Flink处理实时数据,Doris提供秒级查询。批处理用Spark,跑完也写入Doris。这样一套架构,能覆盖90%的金融数据计算需求。

嗯,数据计算层就聊到这儿。记住:没有银弹,只有最适合你场景的方案。选型时多想想「我到底要解决什么问题」,而不是「哪个技术最火」。

专注资料整理