微批是什么
微批把无界的流按固定的小时间间隔切成一个个有界批次,逐批读取、计算、提交结果,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 分钟级是常见起点,再按延迟要求调整。
批次实际耗时才是决定积压的关键:当处理时间持续大于触发间隔,批次会连续排满,此时缩短间隔只会让小文件更多而不是更快。