一周综合实训:可复现的数据分析系统
在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任务在终端提交。
完成三项验证并保存证据:
- 用一份独立小数据集加入NULL、负value和重复event_id,验证离线口径。异常样例采用独立输入、输出和checkpoint目录。
- 正常停止流查询,保留checkpoint重启;无新文件时结果不翻倍,再添加新seed文件并观察更新。
- 停止并重新启动虚拟机与服务,按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分。个人部分依据报告中的成员记录和本人操作截图评分;课程总评比例沿用教学大纲。