本页目录
  1. 组织与题目
  2. 系统结构
  3. 第一天:连通系统与定义口径
  4. 第二天:离线分析
  5. 第三天:窗口统计与告警
  6. 第四天:展示、异常与恢复
  7. 第五天:复现与个人操作记录
  8. 报告提交前核对
  9. 评分

一周综合实训:可复现的数据分析系统

在Windows打开学生包starter/reports/practicum-report.docx,另存为组号+题目+实训报告.docx。每步按下方列出的Word栏目填写结果、粘贴文本和插入图片,最终提交这一份Word报告。

组织与题目

4–5人一组,从P00镜像独立开始。所有成员轮换角色,均须修改代码、运行任务并解释结果,每日在Word报告的成员轮岗与个人操作栏记录修改。

从下列题目选一个,沿用同一技术骨架:

题目 生成器theme value单位 三项离线指标 实时告警建议
电商销售 shop 分 类别订单数、销售额、平均订单额 窗口平均订单额超过3000分
校园食堂 canteen 分 品类订单数、营业额、平均消费 窗口平均消费超过3000分
环境监测 sensor 摄氏度 区域记录数、温度总和、平均温度 窗口均温超过30℃

环境监测中的温度总和作为计算校验项,业务展示采用均温或最高温。可增加最高温作为展示指标。金额统一为整数分,最后展示时才除以100。

系统结构

生成器 → 完整JSON文件 → HDFS → PySpark离线分析与Structured Streaming → 本地JSON结果 → Streamlit展示。

基础系统使用合成数据、HDFS、Spark和给定Streamlit页面。MapReduce结果对照、ZooKeeper采集协调为选做项。每组一台主运行虚拟机即可,其余成员保留自己的环境与作业副本。

数据字段:event_id为业务标识;event_time为带时区的事件时间;category为分类;value为整数值。生成器使用固定seed,默认120条数据,便于另一组复现。基础流计算对有限输入采用complete模式;扩展讨论迟到数据、watermark和状态清理。

先阅读逐步记录与最终提交方法。每日填写Word报告对应步骤;命令中的相对路径均相对~/work/practicum。

第一天:连通系统与定义口径

labctl stop
labctl start practicum
cd ~/work/practicum
mkdir -p evidence/members
cp -n /opt/course/starter/practicum/README-template.md README.md
python generate.py --theme shop --seed 42 --files 6 --rows 20 \
  --interval 0 --hdfs /course/practicum/stream
hdfs dfs -ls /course/practicum/stream

选食堂或传感器题时替换theme。生成器先上传隐藏临时文件,再重命名为.json;流查询只读取完整的.json文件。一个seed在同一目录只投放一次,重复运行会拒绝覆盖。

本步填写 Word 报告:第1天 连通系统与定义口径

粘贴和填写

  • D1.1 主题与字典:填题目、theme、单位和阈值。列出event_id、event_time、category、value的类型、示例、单位及空值/重复规则。
  • D1.2 输入与数量:粘贴生成命令、HDFS目录列表、行数120的核对输出,以及六条输入JSON原文。
  • D1.3 每人记录:逐人填写姓名学号、whoami、pwd、HDFS读取命令和一条实际输出。

预期结果核对

核对项目 预期结果
D1.1 主题 shop或canteen 金额分;sensor 摄氏度
D1.2 初始输入 seed42 6文件×20条=120条
D1.3 每人连接 每人SSH成功并读取HDFS记录
D1.4 数据链路 每段标注实际路径和读取程序

插图位置

  • 图1 D1.4 系统链路图(模板标识 01-pipeline.png):画出本组生成器、HDFS、批/流、结果JSON、网页之间的箭头,并标注实际路径。

本阶段先核对文件数与记录数,再运行计算。报告写出实际6和120的核对证据。

第二天:离线分析

补全batch.py:按event_id去重;过滤空值或负value;按category汇总count、total、avg。输出为JSON对象列表,每个对象包含这四列。补全后执行:

spark-submit --master yarn --deploy-mode client batch.py
cat batch.json

从生成文件中选至少6条记录手算,另存小文件,与程序结果逐项比较。提供纯Python或SQL的独立核对方式。核对记录同时保留输入原文、手算过程和程序输出。

本步填写 Word 报告:第2天 离线分析

粘贴和填写

  • D2.1 程序与结果:粘贴批运行命令、application ID、清洗前后行数及batch.json全文。
  • D2.2 六条手算:粘贴02-small.jsonl原文,列逐条保留或删除理由,以及按类手算与程序结果。
  • D2.3 核对过程:粘贴独立核对命令、输出和差值;count/total按整数比较,avg注明精度。完整源码放源码区。

预期结果核对

核对项目 预期结果
D2.1 初始清洗 seed42的120条均有效 去重过滤后120
D2.2 手算小样本 至少6条 逐类核对count total avg
D2.3 独立复算 纯Python或SQL结果与Spark相同
D2.4 YARN状态 FINISHED和SUCCEEDED

插图位置

  • 图2 D2.4 批作业完成(模板标识 02-yarn.png):包含地址栏、实际application ID、FINISHED和SUCCEEDED。

小样本在本地文件运行,参数示例:spark-submit batch.py --input file:///home/student/work/practicum/evidence/02-small.jsonl --output evidence/02-small-result.json。独立核对使用同一小样本。

第三天:窗口统计与告警

补全stream.py的过滤和10秒窗口聚合,得到count、total、avg;在给定写入函数中补全阈值比较。

# 有限数据先做确定性验证
spark-submit stream.py --once --threshold 3000
cat stream.json
# 再持续监听
spark-submit stream.py --threshold 3000

另一个终端生成新seed的数据文件。新seed默认从相同事件时间起点开始,会更新已有窗口,正好可观察到达时间与事件时间的差异:

python generate.py --theme shop --seed 43 --files 3 --rows 10 \
  --output input-next --interval 3 --hdfs /course/practicum/stream

传感器题将上述两条命令的阈值改为--threshold 30;金额题的3000单位为分。

基础流统计按输入记录计数,离线统计按event_id去重;解释两种口径在重复事件上的差异。若自己加入去重,说明对状态和恢复的影响。

本步填写 Word 报告:第3天 窗口统计与告警

粘贴和填写

  • D3.1 首次有限计算:粘贴--once命令、关键日志和03-stream-seed42.json全文。
  • D3.2 告警手算:选择两个窗口,粘贴对应原始事件、均值计算、阈值、实际alert;有命中和未命中时各选一个。
  • D3.3 追加前后:粘贴持续查询和seed43生成命令、追加后JSON、选定窗口前后count/total/avg对照。说明新到达文件如何更新旧事件时间窗口。

预期结果核对

核对项目 预期结果
D3.1 固定窗口结果 seed42各窗口count之和120
D3.2 告警 金额avg>3000分;传感器avg>30℃
D3.3 追加seed43 3文件×10条 新总数150

插图位置

  • 图3 追加前(模板标识 03-live-before.png):显示生成和查询终端、选定窗口初值与观察时间。
  • 图4 追加后(模板标识 03-live-after.png):显示seed43投放及选定窗口的新值,保留相同输入与checkpoint信息。

先等待持续查询启动,再投放新seed。截图与日志须标出seed、实际时间和被比较的窗口。持续查询正常停止后再进行下一阶段。

第四天:展示、异常与恢复

在项目目录启动给定页面:

streamlit run app.py --server.address 127.0.0.1 --server.port 8501

Windows通过SSH隧道访问 http://127.0.0.1:18501。点击刷新读取新结果。页面读取计算输出;Spark任务在终端提交。

完成三项验证并保存证据:

  1. 用一份独立小数据集加入NULL、负value和重复event_id,验证离线口径。异常样例采用独立输入、输出和checkpoint目录。
  2. 正常停止流查询,保留checkpoint重启;无新文件时结果不翻倍,再添加新seed文件并观察更新。
  3. 停止并重新启动虚拟机与服务,按README恢复系统。结果文件、源数据和checkpoint均保留;记录恢复采用的输入、查询代码和状态目录。

为新增的数据再运行一次离线任务,比较全部流窗口的count/total之和与离线结果。若输入包含业务重复,基础流与去重后的批结果可能不同,必须解释原因。

本步填写 Word 报告:第4天 展示异常与恢复

粘贴和填写

  • D4.1 网页与结果对应:填写展示指标、单位、阈值,说明页面读取的两个JSON路径。
  • D4.2 异常原文与手算:粘贴至少六条独立异常JSON、逐条判定、手算及实际结果。重复ID使用相同内容,另存输入输出路径。
  • D4.3 查询恢复:粘贴恢复前后JSON、两次命令、diff退出码;记录代码、输入URI、checkpoint绝对路径和commits/offsets清单。
  • D4.4 整机恢复:粘贴关机前后服务检查、查询启动、seed44追加命令及最终结果;写明记录数160。
  • D4.5 批流对照:逐类列batch的count/total/avg及所有窗口的count/total总和,用total/count求avg并列差值。

预期结果核对

核对项目 预期结果
D4.1 网页入口 Windows 127.0.0.1:18501
D4.2 异常样本 NULL 负value 重复event_id均覆盖
D4.3 150条上的原状态恢复 无新输入时结果不翻倍
D4.4 整机恢复后追加seed44 1文件×10条 总数160
D4.5 批流核对 无重复且口径相同时count total相等

插图位置

  • 图5 系统页面(模板标识 04-dashboard.png):地址栏、系统题目、批/流表格和图表、指标单位与阈值均可读;可分a和b两图。
  • 图6 整机恢复后(模板标识 04-recovered.png):显示服务恢复后页面指标及seed44更新后的结果。

异常输入使用独立路径,例如file:///home/student/work/practicum/evidence/04-invalid.jsonl,输出用--output evidence/04-invalid-result.json,与基础数据分开。若验证异常流输入,采用单独目录和新checkpoint。

D4.3先在150条记录上重启并比较。D4.4在恢复查询启动后用新seed44追加1文件×10条,单独本地目录input-recovery、同一HDFS基础输入目录;生成参数与第3天相同,只改seed、文件数、行数与output。此时完整基础输入为10个文件、160条无重复有效事件,最终批流数量应同为160。停止持续查询后以相同参数的--once补齐可见数据,再做最终比较。

保存checkpoint摘要:find checkpoint/commits checkpoint/offsets -maxdepth 1 -type f | sort > evidence/04-checkpoint-list.txt。原状态留在虚拟机,用于后续恢复操作。

第五天:复现与个人操作记录

在另一份P00起点镜像中复制本组代码,根据README重新生成固定seed输入并计算结果。将复现所用文件数、每文件行数和seed填写到报告D5.2。

每人选择一项实际完成的任务,在Word报告“D5.3 每人成果”中记录预测、代码修改、命令、结果和书面解释,并插入本人操作截图。

本步填写 Word 报告:第5天 复现与个人操作记录

粘贴和填写

  • D5.1 运行说明:完整README粘贴到源码与运行说明区;包含生成、批流、页面、停止恢复命令及预期120→150→160。
  • D5.2 复现记录:粘贴新镜像编号、操作者、全部命令、复现批流JSON及与基准的差值。缩小规模时写清新参数和对应手算。
  • D5.3 每人成果:按成员复制以下记录:姓名学号、本人任务、预测、修改前后代码片段、运行命令、实际输出与书面解释。
  • D5.4 核对:填写成员轮岗表、逐人记录及AI披露,检查全部插图和源码可读。

预期结果核对

核对项目 预期结果
D5.1 README 从新P00可按命令复现 含seed与全部路径
D5.2 新P00结果 同参数固定seed结果相同
D5.3 个人操作 每人修改代码并记录运行结果与书面解释
D5.4 最终提交 组号命名的一份Word报告

插图位置

  • 图7 D5.3 个人操作 每人一张(模板标识 05-operation.png):每人分别插入一张,图前标注姓名学号;图中显示本人操作终端、命令与关键结果,正文解释本人修改。

报告提交前核对

对应 Word 的“源码与运行说明”区

  • batch.py全文。
  • stream.py全文。
  • verify.py或verify.sql全文。
  • app.py修改片段或说明使用给定页面。
  • README运行说明全文。

按模板粘贴实际运行内容,保留缩进并填写文件在虚拟机中的绝对路径。

逐项检查

  • [ ] 报告“第1天 连通系统与定义口径”的实际结果及填写栏目完整。
  • [ ] 报告“第2天 离线分析”的实际结果及填写栏目完整。
  • [ ] 报告“第3天 窗口统计与告警”的实际结果及填写栏目完整。
  • [ ] 报告“第4天 展示异常与恢复”的实际结果及填写栏目完整。
  • [ ] 报告“第5天 复现与个人操作记录”的实际结果及填写栏目完整。
  • [ ] 图1 D1.4 系统链路图已插入,符合模板中的截图要求。
  • [ ] 图2 D2.4 批作业完成已插入,符合模板中的截图要求。
  • [ ] 图3 追加前已插入,符合模板中的截图要求。
  • [ ] 图4 追加后已插入,符合模板中的截图要求。
  • [ ] 图5 系统页面已插入,符合模板中的截图要求。
  • [ ] 图6 整机恢复后已插入,符合模板中的截图要求。
  • [ ] 图7 D5.3 个人操作 每人一张已插入,符合模板中的截图要求。
  • [ ] 姓名、学号、班级等身份信息完整;实训填写全体成员及个人记录。
  • [ ] AI使用情况报告填写简短说明或粘贴一张相关截图;未使用填“未使用”。
  • [ ] 保存后重新用Microsoft Word打开,检查截图和文本可读。

按Word记录与提交方法提交填写完成的一份Word报告。教师依据报告中的实际结果、源码、截图和个人记录评分。

评分

教师依据Word报告评分:功能35分、数据正确性20分、恢复与复现15分、个人操作记录与书面解释25分、文档及AI记录5分。个人部分依据报告中的成员记录和本人操作截图评分;课程总评比例沿用教学大纲。