4. 数据计算层设计:批处理、流处理与OLAP引擎
数据计算层,说白了就是整个平台的「发动机」。数据进了湖,怎么算、怎么查、怎么快,全看这一层。我这些年做过的金融项目,踩坑最多的也是这里。今天咱们就聊聊批处理、流处理和OLAP引擎这三块,怎么选、怎么搭。
4.1 批处理:Spark还是Flink Batch?
批处理,金融场景里最常见的需求——日终跑批、报表生成、历史数据回溯。我习惯把批处理比作「夜间工厂」,白天不干活,晚上拼命算。
Spark Batch 是老牌选手了。我记得2018年做某券商的数据平台,每天凌晨2点跑批,处理200亿条交易记录。Spark的DAG调度和内存计算,确实快。但有个坑——数据倾斜。某个热门股票的交易量是其他股票的100倍,结果一个task跑死,其他task闲着。解决方案?加盐、重分区、或者用Adaptive Query Execution(AQE)。
Flink Batch 是后来者。Flink本质上是个流处理引擎,但它的批处理模式(Batch on Flink)也做得不错。我去年在某个项目中试过,用Flink跑T+1的报表,发现它比Spark更省资源——因为Flink的算子链优化做得更好。但说实话,Flink的批处理生态不如Spark,比如Hive on Flink就不如Spark SQL成熟。
| 维度 | Spark Batch | Flink Batch |
|---|---|---|
| 成熟度 | ★★★★★ | ★★★☆☆ |
| 资源利用率 | ★★★☆☆ | ★★★★☆ |
| SQL支持 | ★★★★★ | ★★★★☆ |
| 数据倾斜处理 | ★★★★☆(AQE) | ★★★☆☆ |
4.2 流处理:Flink还是Spark Streaming?
流处理,金融场景的刚需——实时风控、实时指标、实时大屏。你想想看,用户刚下了一笔大额转账,系统必须在毫秒级判断是不是洗钱。这时候批处理就歇菜了,得上流处理。
Flink 是我现在的主力。为什么?因为它有真正的「事件时间」语义。我记得做某支付公司的实时风控时,用户手机网络延迟,事件晚到了10秒。如果用Spark Streaming,这10秒的数据就丢了。但Flink的Watermark机制,能等一等迟到的数据。嗯,这里要注意:Watermark设置太短,丢数据;太长,延迟高。我一般设成「最大延迟时间 + 500ms」。
Spark Streaming 本质上是微批处理。它把流切成一个个小批次(比如1秒一个批次),然后跑批处理逻辑。好处是跟Spark Batch无缝衔接,坏处是延迟高(秒级),而且处理不了乱序数据。我见过有人用Spark Streaming做实时风控,结果因为数据乱序,误判率高了10%。
我个人的经验是:实时风控、实时指标用Flink;实时大屏、简单ETL用Spark Streaming。前者要求高,后者够用就行。
4.3 OLAP引擎:ClickHouse还是Doris?
OLAP引擎,说白了就是「查得快」。批处理算完了,流处理也实时更新了,数据存哪?怎么查?这就是OLAP引擎的活。
ClickHouse 是我最早用的。2019年做某银行的用户画像系统,每天查询量上亿次。ClickHouse的列式存储和向量化执行,确实快。单表查询,秒级响应。但有个问题——多表Join性能差。我试过用ClickHouse做星型模型查询,结果慢得离谱。后来改用宽表,才解决问题。
Doris 是后来崛起的。我去年在某个项目中,用Doris替换了ClickHouse。为什么?因为Doris的多表Join性能好。它用的是MPP架构,支持Hash Join和Broadcast Join。我测试过,10亿条事实表Join 1000万条维度表,Doris只要3秒,ClickHouse要15秒。而且Doris支持标准SQL,对分析师更友好。
| 维度 | ClickHouse | Doris |
|---|---|---|
| 单表查询 | ★★★★★ | ★★★★☆ |
| 多表Join | ★★☆☆☆ | ★★★★★ |
| SQL兼容性 | ★★★☆☆ | ★★★★★ |
| 运维复杂度 | ★★★☆☆ | ★★★★☆ |
4.4 整体架构图
下面这张图,是我在多个项目中沉淀下来的数据计算层架构。你仔细看,批处理、流处理、OLAP引擎是怎么协同的。
这张图的核心逻辑是:流处理负责实时数据,批处理负责离线数据,OLAP引擎统一对外提供查询服务。我见过很多团队,把流处理和批处理的结果分开存,结果查询时还得拼数据,麻烦得很。统一入口,省心省力。
4.5 选型总结
说了这么多,最后给个总结。你选型时,问自己三个问题:
- 数据延迟要求多高? 秒级 -> Flink;分钟级 -> Spark Streaming;小时级 -> Spark Batch。
- 查询场景是单表还是多表? 单表 -> ClickHouse;多表 -> Doris。
- 团队技术栈是什么? 如果团队熟悉Java/Scala,选Flink;熟悉Python/SQL,选Spark。
嗯,数据计算层就聊到这儿。记住:没有银弹,只有最适合你场景的方案。选型时多想想「我到底要解决什么问题」,而不是「哪个技术最火」。