用途
无服务器 Spark 将集群故障隐藏在短生命周期运行时和不透明的重试之后。当智能体把无服务器 Spark 当作长时间运行的集群作业处理时,静默的部分写入、孤儿检查点和超时引发的数据损坏十分常见。本技能强制在任何发布路径开启之前,明确状态边界、可恢复进度和清理机制。
适用场景
- 在 AWS Lambda、AWS Glue serverless 或类似的短生命周期运行时上实现或审查 Spark
- 设计基于 S3 的检查点、进度标记或分阶段写入路径
- 从超时、OOM 或批次中途部分失败中恢复,且不重复计数
- 将 IceGuard 风格的检查点与回滚模式转化为智能体工作流
- 加固必须承受冷启动、内存限制和硬性执行上限的批处理 Spark
不适用于常驻的 EMR 或 Databricks 集群,除非该作业同时运行在具有硬性时间限制的无服务器路径上。
工作流程
1. 编码前先对执行风险分类
记录以下内容:
- 最大运行时和内存上限
- 输入基数与分区扇出
- 输出是追加、合并还是覆盖
- 会看到部分数据的下游消费者
- 作业是否可从已知偏移量或分区集重新启动
2. 设计可恢复的检查点契约
要求:
- 对象存储中的持久进度标记(例如 s3://.../checkpoints/{run_id}/)
- 与编排元数据绑定的显式运行标识符
- 目标粒度上的幂等写入语义
- 发布前的清单或 _SUCCESS 风格门控
- 暂存前缀与发布前缀的分离
加载 references/spark-serverless-reliability-patterns.md 以获取检查点布局和孤儿检测模式。
3. 实现超时感知回滚
在任何发布之前:
- 检测不完整分区或缺失的清单文件
- 当运行时接近上限时回滚暂存输出
- 持久化最后已知良好的检查点状态以供恢复
- 回滚不完整时阻止下游发布
- 发出结构化失败上下文(运行 ID、分区范围、已写入字节数)
4. 规划孤儿与僵尸清理
包括:
- 针对被遗弃暂存前缀的 TTL 或生命周期规则
- 列出超过 N 小时的孤儿检查点的对账作业或钩子
- 清理自动化的明确归属
- 防止删除进行中运行的护栏
5. 生产前配合可观测性
当需要实时执行计划、阶段指标或集群信号来在部署前诊断 OOM 或数据倾斜时,加载 mcp-data-observability-integration。
6. 在有界切片上验证恢复路径
验证:
- 批次中途强制超时后恢复,且不重复发布
- 从检查点重跑产生完全相同的、符合契约的输出
- 孤儿清理不会移除活跃运行
常见合理化借口
| 借口 | 现实 |
|---|---|
| “Lambda 会重试整个函数。” | 重试可能重复写入、留下孤儿暂存数据并发布部分分区。 |
| “我们可以直接写入最终表路径。” | 无服务器超时使直接写入在没有暂存和清单门控的情况下非常危险。 |
| “检查点只用于流处理。” | 任何具有硬性运行时限制的可恢复批处理都需要持久进度标记。 |
| “Glue 会自动处理清理。” | 托管运行时并不保证孤儿清理或部分湖写入的回滚。 |
危险信号
- 写入直接进入发布路径,没有暂存边界
- 不存在运行 ID 或检查点清单
- 超时处理未定义
- 部分 S3 前缀没有孤儿检测或 TTL 策略
- 恢复逻辑无法区分已完成与进行中的分区
- 智能体扩展分区时未检查每个任务的内存上限
验证清单
- 运行时限制、写入模式和幂等粒度已记录
- 检查点和暂存布局支持安全恢复
- 超时回滚和发布门控是显式的
- 孤儿清理的归属和检测存在
- 在完整部署前已在有界分区切片上验证恢复