流批一体:是真统一,还是两套系统的抽象?
流批一体试图用统一 API 和执行模型处理有界与无界数据,但工程上仍要面对延迟、状态、成本和口径一致性。
流批一体:是真统一,还是两套系统的抽象?
流批一体听起来很美:同一套 API,同时处理离线数据和实时数据。同一个指标逻辑,可以跑历史,也可以跑实时。
但工程上,流和批的差异并不会因为抽象统一就消失。
Rendering diagram...
有界和无界
批处理的数据有边界。比如昨天所有订单。
流处理的数据无边界。比如不断到来的支付事件。
Flink 认为批是有界流。Spark Structured Streaming 也用类似 DataFrame 的接口表达流式计算。
统一的价值
统一 API 可以减少重复开发。实时指标和离线校准可以复用更多逻辑。
统一 Catalog 和表格式也让同一份数据可以被 Spark、Flink、Trino 访问。
不统一的地方
流处理要处理乱序、状态、Checkpoint、迟到数据和反压。
批处理更关注吞吐、Shuffle、分区、小文件和资源利用率。
同一个 SQL 在批和流里,语义可能不同。例如 COUNT DISTINCT 在流里可能需要长期状态。
实践建议
不要为了流批一体而流批一体。可以先做到指标口径统一、表结构统一、Catalog 统一,再考虑执行逻辑统一。
很多系统仍然采用实时 + 离线校准:Flink 出实时趋势,Spark 产出权威日结结果。
小结
流批一体是方向,但不是魔法。它能减少一部分重复,但不会消除流处理和批处理在时间、状态、成本上的根本差异。