实验2:Python MapReduce(4学时)
在Windows打开学生包starter/reports/lab02-report.docx,另存为学号+班级+姓名+实验2报告.docx。每步按下方列出的Word栏目填写结果、粘贴文本和插入图片,最终提交这一份Word报告。
目标与起点
从L02镜像独立开始,HDFS已初始化、Hadoop Streaming和Python可用。镜像提供本次所需输入和配置。用8个单词的小样本理解Map、按键分组、Reduce,再提交真实YARN作业。
建议180分钟:启动与手算25;Mapper40;Reducer35;YARN运行35;修改及排错25;整理报告20。
labctl stop
labctl start lab02
cd ~/work/lab02
mkdir -p evidence
cat /opt/course/data/words.txt
准备阶段先运行labctl doctor并记录镜像编号;截图、结果与源码按记录与提交方法整理。
1 先预测输出
输入共8个词:spark=3, hadoop=2, data=2, python=1。先在纸上写出第一行 spark hadoop spark 的三条Map输出,用真正的制表符分隔单词和数字1。
本步填写 Word 报告:1 先预测输出
粘贴和填写
- 输入原文:粘贴words.txt三行全文。
- 手算Map与Reduce:写出第一行spark hadoop spark的三条Map输出,再手算四键计数,保留单词与数字间的制表符。
- 环境检查:填写镜像编号,粘贴labctl doctor关键输出。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| 输入词数 | 8 |
| 不同单词数 | 4 |
| 词频 | data=2 hadoop=2 python=1 spark=3 |
2 完成Mapper
编辑 mapper.py,把TODO处的异常改成输出记录。日志写到stderr,stdout只放 word<TAB>count。
python mapper.py < /opt/course/data/words.txt
python mapper.py < /opt/course/data/words.txt | LC_ALL=C sort
预期未排序时8行;排序后同一单词挨在一起。本地sort展示按键排序;Hadoop的Shuffle负责分区、传输、排序和分组。
用可复制文本保存中间结果:
python mapper.py < /opt/course/data/words.txt > evidence/02-mapped.txt
LC_ALL=C sort evidence/02-mapped.txt > evidence/02-sorted.txt
wc -l evidence/02-mapped.txt evidence/02-sorted.txt
本步填写 Word 报告:2 完成Mapper
粘贴和填写
- 中间结果:粘贴02-mapped.txt的8行原文,再粘贴02-sorted.txt及wc -l的行数。
- 实现说明:写出分词、输出制表符以及stdout与stderr的用途;最终源码粘贴到源码区。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| Map输出 | 8行word<TAB>1 |
| 排序后 | 8行 同一单词相邻 |
3 完成Reducer
同一个单词累加;单词改变时输出前一个词并重置;循环结束后输出最后一个词。空输入对应空输出。
python mapper.py < /opt/course/data/words.txt |
LC_ALL=C sort | python reducer.py
printf '' | python reducer.py
第一条应得到四行:data 2、hadoop 2、python 1、spark 3,中间为制表符。第二条不输出。本地管道结果正确后再提交YARN。
python mapper.py < /opt/course/data/words.txt | LC_ALL=C sort | python reducer.py > evidence/03-local.txt
printf '' | python reducer.py > evidence/03-empty.txt
printf 'only\t1\nonly\t1\n' | python reducer.py > evidence/03-last-key.txt
wc -c evidence/03-empty.txt
cat evidence/03-last-key.txt
本步填写 Word 报告:3 完成Reducer
粘贴和填写
- 本地管道:粘贴Mapper→sort→Reducer命令和四行结果。
- 边界输入输出:粘贴空输入命令、wc -c结果,以及两条only记录的输入和实际输出。
- 收尾逻辑:说明循环结束后如何输出最后一个键;最终Reducer源码粘贴到源码区。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| 规定输入 | data=2 hadoop=2 python=1 spark=3 |
| 空输入 | 0字节输出 |
| only单键输入 | only<TAB>2 |
4 提交YARN作业
bash submit.sh 2>&1 | tee run.log
hdfs dfs -cat '/course/lab02/output/part-*'
labctl check lab02
yarn application -list -appStates ALL
在YARN网页中找到本次application,记录ID与最终状态,比较HDFS结果和本地结果。一次只运行一个课程作业,资源按小型虚拟机配置。
tee记录日志;application的FinalStatus和labctl check分别检查运行状态与数据结果。默认脚本禁止覆盖已有输出。
hdfs dfs -cat '/course/lab02/output/part-*' > evidence/04-hdfs-result.txt
yarn application -status application_实际编号 > evidence/04-yarn-status.txt
把上面的application占位符换成run.log中的实际ID。
本步填写 Word 报告:4 提交YARN作业
粘贴和填写
- 命令与日志:粘贴bash submit.sh的执行命令、run.log中的application ID及成功结束的关键日志。
- 状态与结果:粘贴yarn application -status的State与Final-State,以及HDFS part文件的完整四行结果。
- 本地与YARN对照:逐键填写两者计数和是否一致,说明一次作业的调度与启动过程。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| 最终状态 | FINISHED和SUCCEEDED |
| HDFS结果 | 与本地四键词频相同 |
插图位置
- 图1 YARN作业完成(模板标识
04-yarn.png):包含地址栏、实际application ID、State为FINISHED及FinalStatus为SUCCEEDED;ID与本报告日志一致。
5 重跑修改和排错
确认旧结果已记录后,只删除本实验输出再运行:
hdfs dfs -rm -r /course/lab02/output
bash submit.sh
个人修改:另建一个小输入,加入大写单词 Spark。先记录大小写敏感时的预测,再修改Mapper统一为小写。个人样例先按下方的独立本地流程完成;最终规定样例仍应通过检查。
故障练习:不删除已有输出就再提交一次,解释拒绝覆盖的原因。若YARN报容器或Python错误,查看 run.log 与网页容器日志;重跑时将删除范围限定为/course/lab02/output。
个人样例采用独立本地输入,具体步骤如下:
printf 'Spark spark\n' > evidence/05-case-input.txt
# 修改为小写归一之前运行,结果应区分Spark与spark
python mapper.py < evidence/05-case-input.txt | LC_ALL=C sort | python reducer.py > evidence/05-before.txt
保存修改前结果后,编辑并保存Mapper,使输出单词统一为小写,再执行:
python mapper.py < evidence/05-case-input.txt | LC_ALL=C sort | python reducer.py > evidence/05-after.txt
本步填写 Word 报告:5 重跑修改和排错
粘贴和填写
- 个人输入与前后结果:粘贴05-case-input.txt、05-before.txt及05-after.txt全文;写明运行前预测。
- 代码修改:粘贴归一前后改动的代码行,说明修改位置。
- 错误及重跑:粘贴输出目录已存在的错误、只删除/course/lab02/output的命令及重跑结果。
- 最终检查:粘贴labctl check lab02的输出。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| 修改前输入 | Spark spark |
| 修改前计数 | Spark=1 spark=1 |
| 小写归一后 | spark=2 |
| 重复提交 | 已有输出目录时拒绝覆盖 |
报告提交前核对
对应 Word 的“源码与运行说明”区
- mapper.py全文。
- reducer.py全文。
按模板粘贴实际运行内容,保留缩进并填写文件在虚拟机中的绝对路径。
逐项检查
- [ ] 报告“1 先预测输出”的实际结果及填写栏目完整。
- [ ] 报告“2 完成Mapper”的实际结果及填写栏目完整。
- [ ] 报告“3 完成Reducer”的实际结果及填写栏目完整。
- [ ] 报告“4 提交YARN作业”的实际结果及填写栏目完整。
- [ ] 报告“5 重跑修改和排错”的实际结果及填写栏目完整。
- [ ] 图1 YARN作业完成已插入,符合模板中的截图要求。
- [ ] 姓名、学号、班级等身份信息完整;实训填写全体成员及个人记录。
- [ ] AI使用情况报告填写简短说明或粘贴一张相关截图;未使用填“未使用”。
- [ ] 保存后重新用Microsoft Word打开,检查截图和文本可读。
按Word记录与提交方法提交填写完成的一份Word报告。教师依据报告中的实际结果、源码、截图和个人记录评分。