ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

大数据技术与应用实验报告实战:HDFS与MapReduce落地指南

大数据技术与应用实验报告实战:HDFS与MapReduce落地指南 简介《大数据技术与应用微课视频版》配套实验报告面向高校大数据课程学习者及自学者可用于复习实验流程、对照排查环境配置问题。资源围绕 Linux 与 Hadoop 两大实验主线展开Linux 部分覆盖系统发展历史、Shell 常用命令、用户与文件权限管理、目录结构及相对/绝对路径操作Hadoop 部分涵盖单机与伪分布式安装、core-site.xml 与 hdfs-site.xml 等配置、HDFS 文件读写、NameNode/DataNode 角色认知以及 MapReduce 的 Map 与 Reduce 阶段原理并保留了实验步骤、实验结果分析与教师评语等完整结构。压缩包共 1 个 PDF 文件大小约 1.92MB可直接阅读、打印或归档目前已有 115 人浏览学习。报告中还记录了 Java JDK 获取、SSH 免密登录、Hadoop 编译与配置等环节的常见问题能帮助读者从 Linux 命令逐步过渡到分布式存储与计算弥合理论学习和实际部署之间的差距。1. 你盯着这份实验报告 PDF 的时间可能比看微课视频还长如果你手里正拿着《实验报告-大数据技术与应用-微课视频版-肖政宏-清华大学出版社.pdf》这个文件名多半不是想“读”它而是要在周末把几份实验结论填完交掉。它是一门大数据入门课的过程性考核材料教材配了微课视频报告负责把你看视频学会的东西变成可以批改的截图、命令、表格和文字结论。适合的人群很具体正在上《大数据技术》或《大数据技术与应用》的学生、准备课程设计的非科班转行者以及想快速把课堂实验改造成毕设素材的人。这篇内容不帮你背概念只帮你把报告变成一套能落地、能复现、能应付验收的施工方案。2. 把微课视频版实验报告读成“施工图”结构拆解与三遍阅读法实验报告不是教材的缩略版它更像一张施工图每个实验都暗含“环境依赖、操作路径、验收输出”三段信息。常见的学习误区是把 PDF 从头到尾看一遍然后对着视频再抄一遍命令最后发现自己根本不知道哪些内容会被老师勾选为评分点。我一般拿到这类报告会先逼自己承认一个事实报告里的大部分实验是“可替代的”。老师真正想看的不是你把 WordCount 跑通了而是你跑通之后能不能说清楚“数据从哪里来、中间经过了什么、结果为什么长这样”。所以读报告的第一目标不是记住每个步骤而是定位“验收点”。这决定了你后续花在环境上的时间值不值。2.1 先定位报告骨架六段式结构里环境清单和验收点最重要这类微课视频版实验报告无论怎么改版单个实验基本都逃不出六段骨架实验目标、实验原理、环境清单、操作步骤、结果记录、结果分析。六段里前两段是“预热”微课视频已经替你讲完了通常不需要细抠真正要精读的是后四段。环境清单是绝大多数学生翻车的第一现场。它可能只写一行“JDK 8 Hadoop 3.x Linux”但你要把这一行翻译成三个具体问题Java 装的是 JDK 还是 JREHadoop 跑在伪分布式还是完全分布式代码是从 Windows 本机提交还是从 Linux 服务器提交。这三个问题只要有一个没定死后面所有命令都会出“看起来没错但就是跑不通”的玄学故障。操作步骤这一段我建议把它当成“验收点清单”而不是“操作教程”。比如步骤里出现“把结果输出到指定目录”你就要立刻标记一个红点这个目录在 HDFS 上的完整路径是什么是/user/hadoop/output还是/output目录名写错一个字符都会让最终统计无法被自动脚本检测。结果记录和结果分析则是报告最容易被扣分的地方后面第 4 章会专门讲怎么写。2.2 微课视频和实验页怎么配对十分钟视频对应的不是十分钟操作微课视频版最让人放松警惕的地方是每段视频都不长。肖政宏这本教材的配套视频以知识点切片为主单个视频大多在十分钟上下但它只负责讲“原理和关键命令”不负责替你踩坑。真正做实验的时间通常是视频时长的 3 到 5 倍其中一半耗在环境修复上。所以我的习惯是“三段式配对”第一遍只看视频不停顿目标是建立对实验流程的全局印象第二遍打开报告对应页面把视频里出现的命令、参数、截图要求抄到报告边缘这一步是在做信息对齐第三遍带着报告去机房或虚拟机里跑跑不动的时候再回到视频里定位那一小段操作。三遍加起来大约两小时但能省下后续反复格式化集群的几小时。特别提醒一个细节微课视频里老师使用的目录、端口、IP 地址经常和实验报告里的验收要求不一致。视频里可能是本机localhost:8088报告却要求提交到集群的hdfs://master:9000。遇到这种情况以报告为准因为最终评分看的是报告里声明的结果不是“我和视频里完全一样”。2.3 容易抄错的三处默认参数端口、副本数、输出目录大数据实验报告的扣分点往往不在算法而在三类默认参数。第一类是端口号HDFS NameNode Web UI 的端口在 Hadoop 2.x 是 500703.x 改成了 9870YARN 的 ResourceManager 页面是 8088。很多同学截图的时候截的是 8088 的 YARN 页面却把它当成 HDFS 页面写在报告里这就属于硬伤。第二类是副本数默认dfs.replication是 3但伪分布式只有一台机器不改成 1 就会出现“块正在复制中”的警告虽然不影响运行但报告截图会很难看。第三类是输出目录Hadoop 的 MapReduce 和 Spark 都不允许输出目录已存在实验报告里一旦写明“输出到某个固定目录”你第二次运行前必须手动删除旧目录否则会直接报FileAlreadyExistsException。参数常见值报告里容易写成正确做法HDFS Web UI 端口9870Hadoop 3.x50070以实际版本号的默认值为准YARN Web UI 端口80889870两个页面分开截图并标注dfs.replication3集群 / 1伪分布式不写在 core-site.xml 或 hdfs-site.xml 中显式配置3. Hadoop 环境与 HDFS 实验先用最小命令把报告里的基础设施跑通不管实验报告这本 PDF 里列了多少个实验Hadoop 集群搭建和 HDFS 文件操作几乎总是排在最前面。这个部分没跑通后面所有实验都建立在沙地上。很多学生卡在这里的第一反应是“重新装一遍”但我建议先搞清楚装的是哪种模式。3.1 单机还是集群伪分布式是这类报告里性价比最高的选择Hadoop 的运行模式有三种本地模式、伪分布式、完全分布式。本地模式不需要启动任何守护进程读写的是本地文件系统适合调试 MapReduce 逻辑但它没有 HDFS也没有 YARN实验报告要求的“上传文件到 HDFS”“查看 Web 页面”在这种模式下全部无法完成。完全分布式需要至少三台机器课堂机和家用电脑经常凑不齐。伪分布式是在一台机器上同时启动 NameNode、DataNode、ResourceManager、NodeManager既有完整的 HDFS 和 YARN 功能又只需要 2GB 左右的内存是这类实验报告最常用的落地方式。配置伪分布式的第一步是把 JDK 路径写进 Hadoop 的环境脚本然后修改 HDFS 的核心配置。下面这套是最小化配置直接复制到etc/hadoop/hdfs-site.xml里就能用configuration property namedfs.replication/name value1/value description伪分布式只有一台 DataNode副本数必须设为 1/description /property property namedfs.namenode.name.dir/name value/opt/hadoop/data/namenode/value /property /configuration这里的逻辑很直接dfs.replication控制每个数据块的副本数量伪分布式场景下如果保留默认的 3DataNode 会把数据复制到本机三个副本既浪费磁盘又让报告截图里满是警告dfs.namenode.name.dir指定 NameNode 的元数据存储路径建议单独建目录不要放在临时目录下否则系统清理临时文件时会把你的集群“回忆”清掉。接下来配置core-site.xml把默认文件系统指向 HDFSconfiguration property namefs.defaultFS/name valuehdfs://localhost:9000/value descriptionNameNode 的 RPC 通信地址/description /property /configurationfs.defaultFS决定了hdfs dfs命令最终连接到哪里。如果你打算在报告里写“在 HDFS 上创建目录”这个地址就必须是hdfs://localhost:9000而不能省略。配置完成后启动服务第一次启动前记得格式化 NameNode# 解压 Hadoop 发行版到固定目录 tar -zxvf hadoop-3.3.6.tar.gz -C /opt/hadoop # 把 JAVA_HOME 写进 hadoop-env.sh建议写绝对路径 echo export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 /opt/hadoop/etc/hadoop/hadoop-env.sh # 首次启动前必须格式化 NameNode等于给文件系统建一个全新的账本 hdfs namenode -format # 启动 HDFS 守护进程 start-dfs.sh # 用 jps 检查进程是否齐全 jps格式化这一步是新手最容易犯错的环节hdfs namenode -format只在第一次启动前执行之后每次重启集群都不需要再格式化。重复格式化会清空 HDFS 上所有已有数据相当于把整个分布式文件系统“恢复出厂设置”这也是你唯一的后悔药但吃完以后数据就没了。格式化成功后再执行start-dfs.sh然后用jps确认能看到NameNode、DataNode、SecondaryNameNode三个进程缺任何一个都说明配置有问题不要急着往下跑。3.2 最小脚本跑通 HDFS 上传下载命令、参数与权限说明HDFS 实验在报告里最常见的验收形式是“把数据文件上传到 HDFS并读取部分内容验证”。这个操作本身不难难的是把每一步都截对图。我建议按下面这段脚本的顺位执行每一条命令都对应一个截屏点# 在 HDFS 上创建用户目录和输入目录/user/student 是学习场景的常用命名 hdfs dfs -mkdir -p /user/student/input # 生成本地测试文件 echo hello hadoop, hello bigdata sample.txt # 把本地文件上传到 HDFS 的指定目录 hdfs dfs -put sample.txt /user/student/input/ # 查看文件是否落地-h 让大小显示为 KB/MB 这种可读单位 hdfs dfs -ls -h /user/student/input/ # 直接读取 HDFS 文件内容相当于分布式文件系统的 cat hdfs dfs -cat /user/student/input/sample.txt这里每条命令的参数都有含义。-mkdir -p会递归创建目录如果父目录不存在也不会报错这是和普通mkdir最大的区别-put等价于上传它把本地文件复制到 HDFS原文件不会消失-ls -h里的-h是 human-readable报告截图里显示 1.1 KB 比 1130 字节更专业。-cat是读取内容特别适合抽样验证上传结果。还有一个容易被忽略的权限问题HDFS 默认开启了权限检查如果当前 Linux 用户是student执行hdfs dfs -mkdir -p /user/student没问题但如果你想写到根目录/tmp之外的地方就可能遇到Permission denied。报告里遇到这种报错不要立刻怀疑配置先执行hdfs dfs -ls /看目录所有者是谁再用hdfs dfs -chmod -R 777 /user/student调整权限。这一步不需要刻意展示但遇到权限报错时知道怎么处理能让你少走一晚上弯路。3.3 “本地模式陷阱”为什么代码在 IDE 里能跑交到报告里就翻车这是 Hadoop 实验里最经典的翻车场景你用 IDEA 或 VS Code 打开一个 Hadoop 项目在本地直接运行 WordCount输入输出都用本地文件路径程序跑通了然后你把这段代码原封不动写进实验报告提交到服务器或虚拟机结果报错一片红。原因很简单你在 IDE 里跑的其实是本地模式代码里的FileInputFormat.addInputPath(job, new Path(input))读取的是 Linux 本地文件根本没有经过 HDFS。但实验报告要求的是“把文件放入 HDFS通过hdfs dfs查看结果”这两者完全是两套体系。正确做法是让代码里的路径变成 HDFS 路径例如把输入路径写成hdfs://localhost:9000/user/student/input输出路径也指向 HDFS。在代码里加一行配置job.getConfiguration().set(fs.defaultFS, hdfs://localhost:9000);这样提交后的 MapReduce 任务才会真正读写 HDFS。这里的fs.defaultFS要和core-site.xml里保持一致否则程序会跑去连一个不存在的节点。如果你用的是 Python 写 MapReduce原理也一样本地调试时读sys.stdin没问题但要提交到 Hadoop Streaming 时输入必须来自 HDFS而不是本地文件。报告里的“结果截图”一定要截 HDFS 路径下的输出目录列表而不是 IDE 控制台里的临时输出。4. MapReduce 与数据预处理把实验报告里的“结果分析”写出含金量HDFS 实验只是把数据搬到了分布式文件系统上MapReduce 实验才是体现“大数据计算”的地方。但报告里这类实验的验收重点并不在于你能不能写一个完美的 WordCount而在于你是不是能解释清楚“输入多少数据、经过什么处理、输出什么格式”。4.1 一个 WordCount 的变体足以覆盖报告里最常见的离线统计实验这几年数据科学与大数据技术专业里的作业题已经从纯 WordCount 变成了更贴近数据的题目比如“统计订单表中每个城市的订单量”或者“统计日志中每个状态码出现的次数”。但本质仍然是 WordCount从一堆记录里按某个 key 做聚合。下面这套 Python 版 MapReduce 是我在实验中比较常用的写法适合写到实验报告里当作“核心实现”#!/usr/bin/env python3 # mapper.py把一行文本拆成词每个词输出一次“词 计数1” import sys for line in sys.stdin: line line.strip() if not line: continue words line.split() for word in words: print(f{word}\t1)#!/usr/bin/env python3 # reducer.py把 mapper 输出的相同 key 合并计数 import sys from collections import Counter counter Counter() for line in sys.stdin: line line.strip() word, count line.split(\t) counter[word] int(count) for word, count in counter.most_common(20): print(f{word}\t{count})这两段代码的逻辑很直白mapper 负责把原始数据切成“键值对”reducer 负责把同一 key 的多个数值累加。strip()是去掉行首行尾的空白字符这在大数据文本处理里是常规动作因为原始日志里混着大量空格和换行符。Counter是 Python 标准库提供的计数工具用它而不是自己写字典累加可以让 reducer 更简洁。要跑起来还得用 Hadoop Streaming 把它们交给集群执行hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar \ -files mapper.py,reducer.py \ -mapper python3 mapper.py \ -reducer python3 reducer.py \ -input /user/student/input \ -output /user/student/output这里的-files是把本地脚本分发到所有节点-mapper和-reducer指定各自要执行的命令-input是 HDFS 上的输入目录-output是结果目录。有一个我踩了很多次的坑-output目录在任务启动前一定不存在如果上一次运行已经生成过同名目录这次必须先用hdfs dfs -rm -r /user/student/output删掉否则任务会在提交阶段就报错。4.2 Python 和 Java 怎么选微课实验里的边界判断打开实验报告的操作步骤你会发现有些实验给出的是 Java 代码片段有些则是 Python 脚本。肖政宏这本微课视频版的配套内容里MapReduce 部分一直存在 Java 和 Python 并行的现象因为教材编写时需要考虑不同学校实验平台的语言支持。我的建议是看验收方式而不是看视频里用了什么。如果实验的验收方式是“在 Hadoop Web 页面看到完成的 MapReduce 任务”那么 Java 版更稳妥因为 Hadoop 原生对 Java Job 的日志和计数器支持最完整也最容易截到明确的SUCCEEDED状态。如果验收方式是“直接在终端里看到统计结果”Python Hadoop Streaming 足够而且代码行数少容易被读懂。还有一种情况是实验平台本身是 Linux 机房加 Jupyter那基本就告别 Java 了直接用 Python 做数据预处理把结果落成 CSV 文件更实际。维度Java MapReducePython Hadoop Streaming环境依赖需要写完整 Job 配置只需要把脚本放到节点上调试速度编译周期慢适合复杂处理改一行就能重跑Web UI 日志最完整报错位置清晰异常信息会封装在流输出里报告书写难度代码量大但流程固定代码简洁但需要说明 Streaming 机制4.3 调参前后结果差 3 倍报告里怎么写对比表才不丢分很多学生的实验报告里结果分析只写一句“程序运行成功输出结果正确”这在评卷时非常吃亏。如果你跑的是 MapReduce其实随便换两个参数就能产生明显差异而且特别适合写成对比分析。比如打开 Combiner 和关闭 Combiner网络传输量可能差好几倍reducer 数量从 1 调到 4运行时长也会变化。下面这个表格可以直接套进报告参数调整输入数据量Shuffle 数据量运行耗时结果是否一致不用 Combiner1 个 reducer200MB约 200MB4 分 20 秒正常开 Combiner1 个 reducer200MB约 90MB2 分 05 秒正常开 Combiner4 个 reducer200MB约 90MB1 分 30 秒正常写这类分析有一条死线不管你调成什么参数最终统计出来的结果数值必须一致。如果换了 reducer 数量之后结果对不上说明你的 reducer 代码不是幂等的这时候不要强行解释直接回去查代码里的聚合逻辑。报告里写明“开启 Combiner 后结果一致仅中间传输量下降”这句话比你贴十行代码都能证明你真的跑通了。5. 实验避坑5 个让新生反复重跑的现象、原因与解决这部分写的是我在处理学生实验报告时最常遇到的五个故障基本覆盖了从环境搭建到结果输出的主要报错场景。每条都按“现象 → 原因 → 解决”的顺序写你可以直接把对应解决方案抄进报告的“问题记录”里。5.1 现象一jps 找不到主类或提示“Error: JAVA_HOME is not set”很多学生配置完 Hadoop 后执行hdfs namenode -format直接报错 Java 环境有问题。原因通常不是 Java 没装而是hadoop-env.sh里的JAVA_HOME指向了 JRE或者路径里多了一个空格。Linux 默认的 Java 安装路径可能藏在/usr/lib/jvm/java-8-openjdk-amd64但有的发行版实际装的是default-java路径名对不上。解决方法是先执行readlink -f $(which java)找到 Java 真实路径再把它写进hadoop-env.sh不要用echo $JAVA_HOME的输出直接复制那个变量可能根本没初始化。5.2 现象二宿主机浏览器访问不了 Hadoop 的 9870 页面虚拟机和本机共享网络时localhost:9870只能从虚拟机内部访问Windows 宿主机打开会一直转圈。原因有两个层面端口没转发或者 Hadoop 只监听了虚拟机的127.0.0.1。如果你用的是 NAT 网络先在虚拟机的hdfs-site.xml里检查dfs.namenode.http-address确认它写的是0.0.0.0:9870而不是localhost:9870然后到 VirtualBox 或 Vmware 的端口转发规则里加上“宿主端口 9870 → 虚拟机端口 9870”。解决后不要在报告里写“我转发了端口”直接附一张宿主机成功打开页面的截图比任何文字都有说服力。5.3 现象三NameNode 一直处于 SafeMode块副本数永远差一点hdfs dfsadmin -report看到Safe mode is ON界面上显示复制的块数和预期不一致。常见原因是上次集群没有正常关闭NameNode 重启后需要校验所有数据块而你的副本数设置和实际 DataNode 数量不匹配。比如dfs.replication2但伪分布式只有一台 DataNode那就永远凑不够副本数。先把hdfs-site.xml里的副本数改成 1然后手动退出安全模式hdfs dfsadmin -safemode leave。如果这招不管用就执行hdfs dfsadmin -report确认 DataNode 是否正常注册DataNode 也挂了的情况下安全模式是退不出去的。5.4 现象四结果文件的英文正常中文全部变成问号MapReduce 或 Hive 跑完后hdfs dfs -cat看到的中文列全是???截图越看越心虚。原因是文本编码不统一输入文件可能是 UTF-8但你的自定义TextOutputFormat或 Python 脚本在输出时用了系统默认编码ASCII。Python 里最常见的是没在输出前做编码声明。在 mapper 和 reducer 脚本开头加两行import sys sys.stdout.reconfigure(encodingutf-8)如果用的是 Java则在配置 Job 时显式设置job.getConfiguration().set(mapreduce.output.textoutputformat.record.separator, \t);这是在做字符串编码不是玄学机制。报告里出现乱码会被直接判定为数据质量问题。5.5 现象五代码在本机能跑提交到服务器就报“ModuleNotFoundError”你自己电脑上 Python 装好了 pandas服务器上没装实验报告里的预处理脚本一提交就崩溃。原因很简单服务器 Python 环境是干净的黑匣子你的依赖不会跟着代码自动飞过去。解决方法是把脚本用到哪些第三方库写清楚不要只写一句“pip install pandas”。报告里更推荐的做法是提供一个requirements.txtpandas2.0.3 numpy1.24.3并在报告中附带执行命令pip install -r requirements.txt的运行截图。这样既能让老师复现你的环境又能避免下次换一台机器时继续踩同一个坑。6. 把实验报告升级成课程设计补可视化与验证两张表课程设计和实验报告的区别在于实验报告只需要“证明你能做”课程设计还要“证明你做得对”。这时候你应该把 PDF 里那些做过的实验当作积木而不是作业本身。6.1 从微课视频里的案例反推扩展点通常微课视频在每个实验的最后会有几十秒留白以“思考题”或“扩展任务”收尾比如“如果数据量翻十倍机器资源不变任务会怎么变化”。这种提问就是天然的课程设计切入点。把视频里提到的可扩展方向记录下来然后选一个能用现有集群验证的维度例如“增加 Combiner 后 Shuffle 数据量的变化分析”把实验报告里的基础代码换成自己的数据集补上一张 ECharts 折线图或柱状图就成了一项独立的可视化分析。6.2 环境自检表与数据抽检表我批改类似报告时有个习惯先看环境自检表再看数据抽检表最后才看算法代码。所谓环境自检表是指你把自己的运行环境信息列成一张清单包括 JDK 版本、Hadoop 版本、内存分配、HDFS 副本数每一项都附一条验证命令的输出截图。数据抽检表则是对输入数据的抽样验证例如随机取 20 条记录把字段数、空值数、最大值最小值列出来。这两张表做完你的报告已经不是学生作业级别而更像是可复现的工程笔记。遇到任何结果对不上的情况先回抽检表里查数据基线的记录这套习惯让我少重跑了不知多少次 MapReduce。希望帮到你。本文还有配套的精品资源点击获取
返回列表