首页/数据/数据工程与 ETL 速查/微批 Micro-batch 模式
管道基础52 条

微批 Micro-batch 模式

微批把流按固定小间隔切成批执行,实现简单、天然幂等,代价是延迟约等于批次间隔;Spark Structured Streaming 即此模型。

微批是什么

微批把无界的流按固定的小时间间隔切成一个个有界批次,逐批读取、计算、提交结果,Spark Structured Streaming 就是典型实现。它的最大好处是复用批处理引擎的优化器与执行框架,容错靠批次级别的重算,逻辑简单、天然幂等。代价是端到端延迟的下限约等于批次间隔——想要秒级以下延迟,微批模型本身就不合适,需要换成长驻的逐条处理引擎。

基本信息

核心思想以时间为界切小批,逐批提交
延迟特征约等于批次间隔
优点复用批处理引擎与优化器,容错简单
代表实现Spark Structured Streaming
状态管理靠 checkpoint 目录保存进度与状态
输出模式append、update、complete 三种

Structured Streaming 触发间隔

Structured Streaming 触发间隔
query = df.writeStream \
    .trigger(processingTime='1 minute') \
    .format('parquet') \
    .option('checkpointLocation', 's3a://bucket/ck/orders') \
    .start('s3a://bucket/dwd/orders')

# 也可以用 availableNow 做「一次跑完当前积压」的批式触发
# .trigger(availableNow=True)

典型使用场景

  • 分钟级准实时:延迟要求不高但希望比 T+1 快的指标链路
  • 复用现有批逻辑:同一段 DataFrame 代码既能批量跑也能流式跑
  • 结果落地列存:每个批次写出一批文件,天然与数据湖表结构契合
  • 容错要求高:批次级重算语义清晰,出问题定位到具体批次即可
  • 与离线调度配合:用批式触发在当前积压上跑一轮,再交给调度器周期调用

三个关键点读法

项含义注意
触发间隔两批之间的等待时间过小则批次密集、文件碎
checkpoint 目录保存进度与状态每个查询必须独立目录
输出模式结果如何写出update 模式会产生更新写
水位线控制状态何时清理不设水位线状态会无限增长
批次耗时单批处理时间接近或超过间隔时需要扩容
间隔过小会带来小文件与元数据开销,1 分钟级是常见起点,再按延迟要求调整。
批次实际耗时才是决定积压的关键:当处理时间持续大于触发间隔,批次会连续排满,此时缩短间隔只会让小文件更多而不是更快。

易错点

  • 多个 query 共用一个 checkpoint 目录会互相破坏状态,必须按 query 隔离
  • 批间隔内数据量抖动大时会频繁空跑,可结合 availableNow 方式调度触发
  • 把间隔配得很小却不解决单批耗时,反而产生大量小文件
  • 不设水位线导致聚合状态无限增长,长时间运行后内存与 checkpoint 双爆
  • 以为微批延迟可以做到秒级以下,选型阶段就应确认延迟目标

数据来源与参考

  • Structured Streaming Programming Guide: Triggers(Apache Spark)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌