3、数据交换模式:批量交换、微批量交换、实时流交换的场景与选择

数据交换怎么做?说白了就三种路子:批量、微批量、实时流。

我见过不少团队,一上来就奔着实时去,觉得实时才高级。结果搞了三个月,延迟没降下来,数据还老对不齐。反过来,也有团队死守批量,业务方天天抱怨报表太滞后。

选哪种模式,不是拍脑袋的事。你得看业务容忍多久的延迟,数据量有多大,下游能不能扛住压力。今天我就把这三类模式的适用场景、技术选型和避坑点,掰开了讲清楚。

3.1 批量交换:稳,但慢

批量交换,就是按固定时间窗口(比如每小时、每天)把数据打包搬过去。这是最古老也最成熟的方式。

核心特征:定时触发、全量或增量抽取、数据落地后再处理。

什么时候选批量?

  • 下游是BI报表、财务对账这类T+1场景
  • 数据量极大(TB级),实时处理成本扛不住
  • 源系统不支持流式读取(比如老旧的Oracle、SQL Server)
  • 需要做复杂的数据清洗、聚合、回溯

我在项目中遇到过一家金融客户,每天凌晨跑批处理交易数据。一开始用Sqoop直抽,跑一次要4小时。后来换成Spark批量读取Parquet文件,压缩后走对象存储,时间压到了40分钟。嗯,这里要注意:批量不是慢的代名词,选对工具和格式,效率能差一个数量级。

我的习惯:批量交换尽量用列式存储(Parquet/ORC),配合分区裁剪和谓词下推。别用CSV或JSON,IO开销太大。

批量交换的典型架构:

源系统(MySQL/Oracle)
    ↓ 定时抽取(Sqoop/DataX/Spark)
暂存区(对象存储 / HDFS)
    ↓ ETL(Spark SQL / Hive)
数据湖(Delta Lake / Iceberg)
    ↓ 定时加载
目标系统(ClickHouse / Redshift)

3.2 微批量交换:折中的艺术

微批量,说白了就是把批量的窗口缩小。比如每5分钟、每1分钟跑一次增量。它不是真正的实时,但延迟已经可以控制在分钟级。

为什么会有微批量?因为很多场景不需要毫秒级响应,但又受不了T+1的滞后。比如实时大屏、运营看板、推荐系统的特征更新。

核心特征:短周期调度、增量处理、状态管理、Exactly-Once语义。

什么时候选微批量?

  • 延迟要求1-10分钟
  • 数据量中等(GB~TB级/天)
  • 需要处理乱序数据或迟到的数据
  • 团队对流处理框架不熟悉,想降低运维复杂度

我个人习惯用 Spark Structured Streaming 做微批量。它本质上是把流当成小批量来算,但提供了Trigger机制,可以精确控制触发间隔。

// 微批量示例:每5分钟处理一次增量
spark
  .readStream
  .format("kafka")
  .option("subscribe", "orders")
  .load()
  .writeStream
  .format("delta")
  .trigger(Trigger.ProcessingTime("5 minutes"))
  .option("checkpointLocation", "/checkpoint/orders")
  .start()

我曾经踩过的坑:微批量的checkpoint目录千万别放在临时盘。有一次集群重启,checkpoint丢了,结果重复消费了整整两小时的数据。从那以后,我坚持把checkpoint放在S3或HDFS上。

微批量 vs 批量对比:

维度 批量 微批量
延迟 小时~天级 秒~分钟级
吞吐量 极高 高
状态管理 无状态 有状态(Watermark + State)
乱序处理 弱 强(Watermark机制)
运维复杂度 低 中

3.3 实时流交换:快,但贵

实时流交换,数据从产生到消费,延迟在毫秒到秒级。典型代表是Kafka + Flink,或者Kafka + Spark Streaming(连续处理模式)。

你想想看,什么场景需要实时?风控、交易监控、IoT设备告警、在线推荐。这些场景下,晚一秒可能就是损失。

核心特征:持续消费、低延迟、状态一致、容错机制。

什么时候选实时流?

  • 延迟要求 < 1秒
  • 数据是连续产生的流式数据(点击流、传感器、交易)
  • 下游系统支持流式写入(如Kafka、Redis、Druid)
  • 团队有流处理运维能力

我建议,除非业务明确要求秒级响应,否则别轻易上实时流。为什么?因为实时流的成本是批量的3-5倍。计算资源、网络带宽、运维人力,样样都得加码。

我的经验:实时流一定要做背压(Backpressure)处理。Flink的Checkpoint机制虽然成熟,但背压没配好,整个拓扑都会崩。我曾经见过一个Flink任务,背压打到100%,结果Kafka消费Lag从100涨到10万,花了半天才恢复。

实时流典型架构:

数据源(App / IoT / DB CDC)
    ↓ 实时采集(Kafka Connect / Debezium)
消息队列(Kafka / Pulsar)
    ↓ 流处理(Flink / Spark Streaming)
实时数仓(Druid / ClickHouse / HBase)
    ↓ 实时查询
应用层(风控 / 推荐 / 监控)

3.4 三种模式的选择矩阵

说了这么多,到底怎么选?我整理了一个选择矩阵,你直接对着看就行。

业务场景 推荐模式 理由
财务对账、月报 批量 T+1可接受,数据量大,需要全量校验
实时大屏、运营看板 微批量 分钟级延迟够用,成本可控
风控、交易反欺诈 实时流 毫秒级响应,错过一笔可能就出问题
推荐系统特征更新 微批量 特征时效性要求5-10分钟,微批量性价比最高
IoT设备告警 实时流 设备状态变化快,延迟必须低
数据湖入湖(CDC) 微批量 CDC数据流用微批量写入Delta/Iceberg,兼顾时效和一致性

3.5 三种模式的核心逻辑图

下面这张图,把三种模式的数据流向和关键差异画出来了。你一看就明白。

数据交换三种模式对比 批量交换 定时触发(每小时/每天) 全量/增量抽取 ETL清洗聚合 加载到目标系统 微批量交换 短周期触发(1-10分钟) 增量处理 + 状态管理 Watermark处理乱序 写入Delta/Iceberg 实时流交换 持续消费(毫秒级) Flink/Spark Streaming 背压 + Checkpoint 写入Kafka/Druid/HBase 选择建议 • 延迟容忍 > 1小时 → 批量(成本最低,吞吐最高) • 延迟容忍 1-10分钟 → 微批量(性价比最优) • 延迟容忍 < 1秒 → 实时流(成本最高,但不可替代)

3.6 混合模式:现实中的常态

说实话,真实项目里很少只用一种模式。大多数Lakehouse架构都是混合的。

比如我做过的一个电商数据平台:

  • 订单交易走实时流,进风控系统
  • 用户行为日志走微批量,每5分钟入湖,供推荐系统用
  • 财务对账走批量,每天凌晨跑全量校验

三种模式共存,互不干扰。关键在于:数据分层要清晰,交换链路要解耦。实时层、近线层、离线层各司其职,别混在一起。

避坑指南:我曾经见过一个团队,把实时流和批量写进同一个Delta表。结果实时流频繁小文件写入,批量读取时性能暴跌。后来我建议他们分层:实时流写到一个独立的实时表,批量再合并到宽表。问题就解决了。

好了,三种模式的核心逻辑和选择方法,就讲到这里。你根据业务延迟、数据量、团队能力,对号入座就行。记住:没有最好的模式,只有最合适的模式。