Spark:Structured Streaming 的时间与输出边界
前置:DataFrame转换/action和聚合。可对照已交付的有界订单批处理理解输入快照;本页只讲持续输入的设计边界,没有可运行流程序。本文固定Apache Spark/PySpark 3.5.6版本族,运行前应核对所在集群版本;不是对4.x的兼容承诺。本轮只写作与静态解析,示例未执行,不启动Spark、JVM或外部服务。
Spark 批处理与流处理
Spark 批处理与流处理的区别首先是输入有界与持续增量。Structured Streaming用相近DataFrame/SQL表达式持续维护结果,通常按微批执行;这不等于把批处理脚本放进while循环。readStream不能直接collect或普通write来结束查询,必须定义writeStream、checkpoint与生命周期。
本包只提供完整批处理工程,不提供半成品流程序;以下是设计边界,未启动任何流查询。传统Spark Streaming的DStream与Structured Streaming不是同一个API。若需求是每天固定快照离线结算,批处理更便于复算;若需持续事件时间窗口,要进一步定义迟到容忍、状态保留和下游幂等。
Spark watermark 迟到边界
Spark watermark 迟到边界以观察到的事件时间进展减延迟阈值为基础,用来约束状态保留和窗口完成;它不是墙上时钟,也不保证空闲输入时持续前进。必须在适当的事件时间列上、聚合或去重之前设置,才能满足相应操作的状态清理条件。多流查询的全局watermark还受慢流与策略影响。
阈值内的迟到数据满足官方保证时不会因过晚被丢弃,超过阈值的数据可能被处理也可能丢弃,不能承诺“严格大于10分钟的一律拒绝”。窗口append模式通常等watermark越过窗口结束才能输出最终行;complete模式保留完整结果表,不能期待相同的状态清理行为。迟到阈值是业务准确性与资源上限之间的契约。
Spark 流去重与输出模式
Spark 流去重与输出模式必须一起设计。3.5新增dropDuplicatesWithinWatermark需要先设置watermark,可在指定延迟范围内按事件ID去重;超出保留范围的重复不能保证仍被识别。批处理dropDuplicates只处理当前快照,不能直接宣称跨批永久唯一。永久去重需要持久业务键索引及成本模型。
append、update、complete是否可用取决于查询和sink;update会重发变化的结果行,下游只追加将产生重复。foreachBatch默认至少一次,重试可再次调用同一batchId;要用批次ID或业务键实现幂等并处理多sink提交。checkpoint记录offset与状态,但不能让不支持事务的外部写入自动exactly-once。修改状态schema、分组键或去重算子后不得盲用旧checkpoint;应按官方兼容范围迁移并安排重放与去重。
资料与版本核对
英文以官方3.5.6固定版本文档为准;中文作者资料用于术语与入门路径,不据旧版教程推断3.5新增API。核对日期:2026-10-17。
继续阅读
- 批处理完整工程
- DataFrame与惰性执行
- 分区与流语义