本页目录
  1. 目标与起点
  2. 1 手算窗口
  3. 2 补全窗口聚合
  4. 3 处理已有文件
  5. 4 保留状态重启与实时更新
  6. 5 告警与状态策略
  7. 报告提交前核对

实验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报告。教师依据报告中的实际结果、源码、截图和个人记录评分。