实验5:实时统计与恢复(2学时)
在Windows打开学生包starter/reports/lab05-report.docx,另存为学号+班级+姓名+实验5报告.docx。每步按下方列出的Word栏目填写结果、粘贴文本和插入图片,最终提交这一份Word报告。
目标与起点
从L05镜像开始,本实验采用本地Spark流计算。提供生成器、schema、结果写入代码,学生补全窗口聚合。
建议90分钟:概念与手算15;补全与运行30;重启20;验证与整理报告25。
labctl stop
cd ~/work/lab05
mkdir -p evidence
cat /opt/course/data/sensors.jsonl
准备阶段先运行labctl doctor并记录镜像编号;截图、结果与源码按记录与提交方法整理。
1 手算窗口
事件时间采用UTC,窗口为10秒滚动窗口,范围左闭右开。例如08:00:00窗口包含01秒和05秒的A事件,其均值为25;09秒的B事件属于同一窗口,其均值为40。
完整确定性结果:
| 窗口起点 | 传感器 | 数量 | 均值 |
|---|---|---|---|
| 08:00:00 | A | 2 | 25 |
| 08:00:00 | B | 1 | 40 |
| 08:00:10 | A | 1 | 18 |
| 08:00:10 | B | 1 | 22 |
| 08:00:20 | A | 1 | 26 |
本步填写 Word 报告:1 手算窗口
粘贴和填写
- 输入与手算:粘贴sensors.jsonl六条事件原文,按上表填写每个窗口包含哪些事件,并计算数量、总值和均值。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| UTC日期 | 2026-10-27 |
| 08:00:00 A | count2 total50 avg25 |
| 08:00:00 B | count1 total40 avg40 |
| 08:00:10 A | count1 total18 avg18 |
| 08:00:10 B | count1 total22 avg22 |
| 08:00:20 A | count1 total26 avg26 |
2 补全窗口聚合
编辑 stream.py,把TODO异常替换为DataFrame聚合表达式,结果命名为summary。需要按 F.window("event_time", "10 seconds") 和sensor分组,得到名称为count、avg的两列。
给定写入器使用complete模式,每个批次原子覆盖完整结果文件。结果表规模较小,写入器通过临时文件与原子替换更新完整JSON。
本步填写 Word 报告:2 补全窗口聚合
粘贴和填写
- 补全部分:粘贴summary聚合表达式,说明count与avg来源;完整stream.py放到源码区。
- 口径说明:写出窗口左闭右开的含义,以及本实验事件时间与生成时间的区别。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| 分组键 | 10秒window和sensor |
| 聚合列 | count与avg |
| 写入字段 | start sensor count avg |
3 处理已有文件
python generate.py --interval 0
spark-submit stream.py --once 2>&1 | tee first-run.log
cat result.json
labctl check lab05
--once使用availableNow触发器,处理当前可见文件后退出,便于检查。文件源依赖完整文件落盘,因此生成器先写隐藏临时文件,再改名发布。
本步填写 Word 报告:3 处理已有文件
粘贴和填写
- 生成与运行:粘贴generate.py --interval 0、spark-submit stream.py --once的命令及正常结束日志。
- JSON全文:粘贴首次result.json的五条完整JSON,逐行对照手算,并粘贴自动检查输出。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| 固定结果 | 五个窗口与传感器组合 |
| 自动检查 | labctl check lab05通过 |
插图位置
- 图1 首次窗口结果(模板标识
03-first-result.png):显示执行命令、五行窗口组合的结果和检查通过输出。
4 保留状态重启与实时更新
记录第一次result.json,再用相同输入、相同checkpoint运行一次。无新文件时,结果应保持一致。保留两次日志,观察checkpoint中的commits与offsets。
用下列命令固定重启证据:
cp result.json evidence/03-first-result.json
spark-submit stream.py --once 2>&1 | tee restart.log
cp result.json evidence/04-restart-result.json
diff evidence/03-first-result.json evidence/04-restart-result.json
printf 'diff_exit=%s\n' "$?" | tee evidence/04-compare.txt
find checkpoint/commits checkpoint/offsets -maxdepth 1 -type f | sort > evidence/04-checkpoint-list.txt
继续观察实时更新:在新目录进行实时演示,避免混入自动检查目录:
# 终端1:持续等待新文件
spark-submit stream.py --input live-input --checkpoint live-checkpoint \
--output live-result.json
终端1保持运行。等待查询启动后,在终端2分批生成数据,间隔2秒:
python generate.py --output live-input --interval 2
终端1运行时,在第三个终端查看 cat live-result.json。生成结束、输出稳定后按Ctrl+C停止。重启时保留同一输入和checkpoint。若修改窗口长度或查询结构,应换新checkpoint并说明这是新查询,保留旧查询的状态目录,供原查询恢复。
本步填写 Word 报告:4 保留状态重启与实时更新
粘贴和填写
- 恢复前后结果:粘贴两次运行命令、首次与恢复JSON、diff命令和diff_exit;写出input及checkpoint绝对路径。
- 状态与实时结果:粘贴commits/offsets文件清单、实时生成和查询命令、最终live-result.json全文,记录生成间隔和观察时间。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| 无新文件恢复 | 结果与首次相同 diff_exit=0 |
| 状态目录 | 原checkpoint中commits与offsets保留 |
| 实时演示 | 部分事件到全部事件 窗口表更新 |
插图位置
- 图2 实时更新前(模板标识
04-live-before.png):包含生成、查询终端及查看结果的命令,显示只处理部分事件的结果。 - 图3 实时更新后(模板标识
04-live-after.png):相同演示输入与checkpoint,显示六条事件处理完成后的完整结果。
5 告警与状态策略
个人修改:把均值大于30的窗口标为告警,输出到另一个文件或报告;规定result.json的结构保持不变。指出本样例只有B在08:00:00窗口满足该条件。
状态策略:本实验对有限输入采用complete模式,保留全部窗口聚合状态。持续输入会使状态增长,可在扩展任务中设计watermark和状态清理。checkpoint记录文件进度与聚合状态;业务去重需另外按事件ID定义规则。
本步填写 Word 报告:5 告警与状态策略
粘贴和填写
- 告警代码与结果:粘贴阈值比较代码、运行命令、05-alerts.json全文;完整代码放源码区。
- 恢复与状态解释:说明恢复保留的信息、持续输入时状态增长,以及同事件换文件名重投与业务去重的关系。
- 最终检查:粘贴labctl check lab05实际输出。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| 告警条件 | avg严格大于30 |
| 唯一命中 | 2026-10-27 08:00:00 B avg40 |
| 原result.json | 结构保留用于规定样例检查 |
报告提交前核对
对应 Word 的“源码与运行说明”区
- stream.py全文。
- alert.py全文或stream.py中独立告警输出代码。
按模板粘贴实际运行内容,保留缩进并填写文件在虚拟机中的绝对路径。
逐项检查
- [ ] 报告“1 手算窗口”的实际结果及填写栏目完整。
- [ ] 报告“2 补全窗口聚合”的实际结果及填写栏目完整。
- [ ] 报告“3 处理已有文件”的实际结果及填写栏目完整。
- [ ] 报告“4 保留状态重启与实时更新”的实际结果及填写栏目完整。
- [ ] 报告“5 告警与状态策略”的实际结果及填写栏目完整。
- [ ] 图1 首次窗口结果已插入,符合模板中的截图要求。
- [ ] 图2 实时更新前已插入,符合模板中的截图要求。
- [ ] 图3 实时更新后已插入,符合模板中的截图要求。
- [ ] 姓名、学号、班级等身份信息完整;实训填写全体成员及个人记录。
- [ ] AI使用情况报告填写简短说明或粘贴一张相关截图;未使用填“未使用”。
- [ ] 保存后重新用Microsoft Word打开,检查截图和文本可读。
按Word记录与提交方法提交填写完成的一份Word报告。教师依据报告中的实际结果、源码、截图和个人记录评分。