资讯详情

大数据实验报告实战:Hadoop环境搭建与MapReduce、Hive排错指南

📅 2026/9/18 2:54:02 | 华诺云谱 👁 阅读
大数据实验报告实战:Hadoop环境搭建与MapReduce、Hive排错指南
简介这是一份与《大数据技术与应用微课视频版》配套的课程实验报告面向高校大数据相关专业学生及自学者旨在通过动手实验串联Linux与Hadoop两大基础技能。报告基于肖政宏主编的清华版教材系统记录了Linux操作系统基本操作、Hadoop安装与伪分布式配置、HDFS文件系统及MapReduce编程模型等核心实验的完整过程。包体为1个PDF文件体积1.92MB包含实验目的、实验步骤、配置文件修改、命令执行与结果分析以及实验心得与教师评语可对照教材同步实操。已有114人学习下载。报告不仅覆盖touch、ls、mkdir、chmod等常用Shell命令和core-site.xml、hdfs-site.xml等关键配置还梳理了NameNode/DataNode角色机制、Map/Reduce阶段工作原理及实验中的常见问题与排错思路适合需要快速完成同类实验报告或系统复习大数据平台搭建要点的读者。1. 当一份实验报告被当作“学习路线图”来读拿到《大数据技术与应用微课视频版》的实验报告 PDF很多人第一反应是拷到本地、翻两页、照着截图抄数据。但这份实验报告的价值远不止“交作业”本身。它是肖政宏老师那本教材的实验映射Linux 基础操作、Hadoop 集群搭建、HDFS 文件读写、MapReduce 计算模型、Hive 数据仓库、ZooKeeper 协调服务这些构成大数据技术栈的地基实验报告正是地基的“验收单”。对于正在上这门课的学生这份 PDF 决定了期末实验分对于准备大数据面试的从业者报告里的每个实验点其实都是面试题的原型比如“HDFS 写入过程中副本是怎么放置的”“MapReduce 的 Shuffle 阶段发生了什么”。这篇文章不打算逐页复述 PDF而是站在“把实验真正跑通、把报告真正写明白”的角度把一套可复现的实验方案、参数配置和排错路径讲清楚。2. 实验报告背后的技术框架与数据流转逻辑2.1 从 PDF 目录反推课程实验主线打开这份 PDF先别急着看正文我一般会先拉一遍目录结构。清华社这类“微课视频版”教材配套的实验报告通常按“基础环境 → 单机组件 → 分布式集群 → 应用案例”四层递进。实验一往往是 Linux 常用命令和 JDK 安装实验二进入 Hadoop 伪分布式或完全分布式搭建实验三聚焦 HDFS 的 shell 操作和 Java API实验四进入 MapReduce 的 WordCount 和自定义序列化实验五通常是 Hive 的建库建表与查询。这个递进关系本身就是大数据技术学习中一条被反复验证的主线先解决“跑在哪”再解决“存哪”然后解决“怎么算”最后回答“怎么查”。你在实验报告里看到的每一个截图、每一段配置本质都是这条主线的某个断点。如果某一次实验没跑通不要只盯着报错看先确认你在主线的哪一层是环境变量没生效还是 NameNode 没起来又或者是 YARN 的资源队列把任务卡住了。2.2 数据流转视角下的组件分工从数据视角看整套实验HDFS 负责“存”MapReduce/YARN 负责“算”ZooKeeper 负责“协调”Hive 负责“把 SQL 翻译成 MapReduce”。实验报告里的每个操作都要落在“数据从哪来、经过谁、到哪去”的链路上。数据来源实验数据通常是 CSV 或文本文件用put命令上传到 HDFS。存储层NameNode 管理元数据DataNode 存实际数据块默认副本数为 3。计算层客户端提交 Job 到 YARNResourceManager 分配资源NodeManager 启动 Container 运行 MapTask 和 ReduceTask。服务层ZooKeeper 负责 NameNode 的 Active/Standby 切换Hive Metastore 存储表结构元数据。我之所以强调这条链路是因为排错时最怕“头痛医头”。比如 Hive 查询报错很多同学反复检查 SQL 语法实际却是 YARN 的内存配置导致 Container 被杀。你只有把实验报告里的每一步映射到这条链路上才知道该看哪个日志。2.3 报告中的关键配置项速查实验报告里会出现大量配置文件这里列一份高频配置表对应常见参数和用途配置文件核心参数作用说明core-site.xmlfs.defaultFS指定 NameNode 地址格式hdfs://localhost:9000hdfs-site.xmldfs.replication数据块副本数单机实验建议设为 1hdfs-site.xmldfs.namenode.name.dirNameNode 元数据存储路径mapred-site.xmlmapreduce.framework.name设为yarn让 MapReduce 跑在 YARN 上yarn-site.xmlyarn.nodemanager.resource.memory-mb单个 NodeManager 可用内存上限yarn-site.xmlyarn.scheduler.maximum-allocation-mb单个 Container 最大内存hive-site.xmljavax.jdo.option.ConnectionURLHive Metastore 的数据库连接地址这份表格在实验报告里未必完整列出但做实验时基本都会改到。伪分布式模式下我最常调整的是dfs.replication因为单台机器上数据只有一份配 3 反而会报副本不足的告警。3. 从 PDF 到可复现搭建实验环境的完整命令链3.1 环境准备与版本选型做这套实验前第一步是确认版本搭配。教材配套视频里基于的 Hadoop 版本可能偏老比如 Hadoop 2.7.x 或 2.10.x这类版本在 JDK 8 下运行最稳。如果你用 Hadoop 3.x注意yarn-site.xml的默认端口和部分配置项发生了变化比如 ResourceManager 的 Web 端口从 8088 变成了 8088未变但 HDFS 的 NameNode 端口还是 98703.x 默认2.x 是 50070。实验报告不会明确告诉你这些版本差异所以不要盲目照抄 PDF 里的截图。我建议按以下组合搭建Linux 发行版CentOS 7.9 或 Ubuntu 20.04二选一即可JDKOracle JDK 8u202 或 OpenJDK 1.8Hadoop2.10.2 或 3.3.6取决于教材内容是否涉及 HDFS 的 NameNode HAHive3.1.3配套 Hadoop 3.x或 2.3.9配套 Hadoop 2.xZooKeeper3.6.3 或 3.7.x提示如果实验报告里明确写了 Hadoop 版本号以报告为准。版本不一致的实验报告和代码经常出现 API 过时的坑比如new Configuration()在新版本里完全一样但Job的创建方式在 2.x 和 3.x 之间略有差异。3.2 SSH 免密登录与 JDK 安装Hadoop 集群启动时主节点需要通过 SSH 免密登录到各从节点这是实验里最容易忽略但也是最基础的一步。以下命令在 CentOS 7 上执行# 生成 RSA 密钥对一路回车即可 ssh-keygen -t rsa -P -f ~/.ssh/id_rsa # 将公钥追加到 authorized_keys cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys # 设置权限否则 SSH 可能拒绝使用该文件 chmod 600 ~/.ssh/authorized_keys # 验证免密登录本机测试 ssh localhost逻辑说明-P 是让私钥文件不使用口令这样 Hadoop 启动脚本在拉起 DataNode 和 NodeManager 时不需要交互式输入密码。chmod 600是 SSH 的安全策略权限过宽会直接忽略该密钥文件。JDK 安装后需要设置两个环境变量# 编辑 /etc/profile追加以下内容 export JAVA_HOME/usr/local/jdk1.8.0_202 export PATH$JAVA_HOME/bin:$PATH # 使环境变量生效 source /etc/profile # 验证 java -version参数说明JAVA_HOME是 Hadoop 启动脚本定位 Java 的路径如果你的 JDK 是通过yum install java-1.8.0-openjdk安装的可以用update-alternatives --list java查看实际安装路径后再写入。不要在这里写死一个不存在的路径否则start-dfs.sh会报JAVA_HOME is not set或找不到 java 命令。3.3 Hadoop 伪分布式最小配置单机实验阶段不需要搭三台虚拟机伪分布式模式就够用。所谓“伪分布式”是在一个进程里分别启动 NameNode、DataNode、ResourceManager、NodeManager模拟分布式效果。核心配置只在三个文件里。先看core-site.xmlconfiguration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/usr/local/hadoop/tmp/value /property /configurationfs.defaultFS决定客户端访问 HDFS 时的默认地址hadoop.tmp.dir是 NameNode 和 DataNode 存放数据的根目录。这个目录一定要预先创建否则启动时 HDFS 会报目录不存在的错误。注意不要把这个目录放在/tmp下因为系统重启会清空导致元数据丢失。再改hdfs-site.xmlconfiguration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/usr/local/hadoop/tmp/dfs/name/value /property property namedfs.datanode.data.dir/name value/usr/local/hadoop/tmp/dfs/data/value /property /configurationdfs.replication设为 1 是因为只有一个 DataNode副本数设为 3 没有意义且会持续报块缺失告警。dfs.namenode.name.dir和dfs.datanode.data.dir如果不手动指定会默认落在hadoop.tmp.dir下但显式写出来方便后续定位数据文件。最后是mapred-site.xml文件不存在就复制模板mv mapred-site.xml.template mapred-site.xmlconfiguration property namemapreduce.framework.name/name valueyarn/value /property /configurationmapreduce.framework.name指定为yarn标志着 MapReduce 任务提交到 YARN 上由 YARN 负责资源调度和 Container 生命周期。如果保留默认值classic任务会跑在 Hadoop 1.x 的 JobTracker 模式下但你根本没有启动这个服务所以作业会一直卡在 submitted 状态。全部改完后格式化 NameNode 并启动# 格式化仅首次执行 hdfs namenode -format # 启动 HDFS start-dfs.sh # 启动 YARN start-yarn.sh # 查看进程 jpsjps命令应输出至少 5 个进程NameNode、DataNode、ResourceManager、NodeManager和SecondaryNameNode。缺哪个就打开对应日志HDFS 日志在/usr/local/hadoop/logs/目录下常见问题是 NameNode 起不来对应日志里会输出NameNode is not formatted此时重新执行hdfs namenode -format即可。4. 实验报告的核心实验项目从 WordCount 到自定义 Counter4.1 WordCount 的完整实现与调优WordCount 是 MapReduce 的“Hello World”但实验报告里的 WordCount 往往要求你不仅跑通还要能解释每一步。直接写一个可从命令行提交的完整版本import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import java.io.IOException; import java.util.StringTokenizer; public class WordCount { public static class TokenizerMapper extends MapperObject, Text, Text, IntWritable { private final static IntWritable one new IntWritable(1); private Text word new Text(); public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { StringTokenizer itr new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends ReducerText, IntWritable, Text, IntWritable { private IntWritable result new IntWritable(); public void reduce(Text key, IterableIntWritable values, Context context ) throws IOException, InterruptedException { int sum 0; for (IntWritable val : values) { sum val.get(); } result.set(sum); context.write(key, result); } } public static void main(String[] args) throws Exception { Configuration conf new Configuration(); Job job Job.getInstance(conf, word count); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }逻辑说明TokenizerMapper继承Mapper类四个泛型参数分别是输入键、输入值、输出键、输出值。StringTokenizer按空格把一行文本切分成单词每遇到一个单词就输出单词, 1。IntSumReducer把相同单词的所有计数累加输出单词, 总数。CombinerClass设为IntSumReducer这会在 Map 端先做一次本地聚合大幅减少从 Map 端到 Reduce 端的数据传输量。参数说明里有个面试常考点这里CombinerClass直接复用了Reducer类在求和场景下没问题因为求和满足交换律和结合律。但如果你做的是求平均值这类计算复用 Reducer 会导致结果错误因为局部均值和全局均值不相等。实验报告的扩展题里如果出现这种操作一定要单独写一个 Combiner。提交作业到 YARN# 准备输入数据 echo hello world hello hadoop input.txt hdfs dfs -mkdir -p /input hdfs dfs -put input.txt /input # 打包并提交 hadoop jar wordcount.jar WordCount /input /output # 查看结果 hdfs dfs -cat /output/part-r-00000hadoop jar的实际动作是把 jar 包上传到 HDFS 的临时目录然后向 ResourceManager 提交 ApplicationResourceManager 调度 NodeManager 启动 ContainerMapper 和 Reducer 在 Container 内运行。/output目录必须不存在否则作业会直接报FileAlreadyExistsException这是 MapReduce 框架避免覆盖旧结果的安全机制。4.2 自定义 Counter 统计脏数据实验报告里有一类高频题目统计日志中有多少行是脏数据、多少行是合法数据。MapReduce 原生提供计数器Counter机制不必在输出文件里单独加一列。public class LogCountMapper extends MapperObject, Text, Text, IntWritable { enum LogCounter { VALID_LINE, INVALID_LINE } public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { String line value.toString(); // 以逗号分隔若字段数不足 3 个则视为脏数据 String[] fields line.split(,); if (fields.length 3) { context.getCounter(LogCounter.INVALID_LINE).increment(1); } else { context.getCounter(LogCounter.VALID_LINE).increment(1); context.write(new Text(fields[0]), new IntWritable(1)); } } }逻辑说明context.getCounter()可以获取一个自定义枚举类型的计数器increment(1)每处理一条数据就自增一次。作业跑完后从日志尾部可以看到LogCountMapper$LogCounter VALID_LINE15 INVALID_LINE3实验报告里要求“统计非法数据条数”时不要用另一个 Reducer 去数直接用 Counter简单且能从 YARN 的日志里直接查看。面试时如果被问到“这个任务里 Map 端怎么知道输出了多少条数据”答案就是计数器而非context.write的返回值。4.3 使用 Hive 完成实验五的数据分析类实验课程后半段的实验通常从 HDFS 转向 Hive因为数据量变大后手写 MapReduce 已经不适合做交互式查询。一个典型实验是“统计每门课程的最高分、最低分和平均分”在 Hive 里用一条 SQL 解决CREATE DATABASE IF NOT EXISTS course_db; USE course_db; CREATE TABLE IF NOT EXISTS score ( student_id STRING, course_id STRING, score INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE; -- 加载本地数据文件 LOAD DATA LOCAL INPATH /home/hadoop/score.txt INTO TABLE score; -- 统计每门课程分数 SELECT course_id, MAX(score) AS max_score, MIN(score) AS min_score, ROUND(AVG(score), 2) AS avg_score FROM score GROUP BY course_id;逻辑说明FIELDS TERMINATED BY ,告诉 Hive 字段之间以逗号分隔创建表时不会检查数据直到LOAD DATA时才把文件移动到 Hive 的数据仓库目录。这里注意LOCAL关键字带它表示文件在 Linux 本地不带则文件要已在 HDFS 上实验题里这两种加载方式经常混在一起考。参数说明ROUND(AVG(score), 2)保留两位小数这类函数在视觉化大屏类实验中经常用到比如按小时统计流量后用ROUND处理平均值再导出到 ECharts 或 DataGear 做展示。Hive 执行这条 SQL 时底层会把GROUP BY翻译成 MapReduce 作业你可以通过EXPLAIN SELECT ...查看执行计划这也是实验报告加分的写法。5. 实验报告的排错速查三类高频失败场景5.1 DataNode 启动后自动退出伪分布式下最常见的问题start-dfs.sh后jps里没有 DataNode查看日志/usr/local/hadoop/logs/hadoop-hadoop-datanode-主机名.logbase 里通常写着java.io.IOException: Incompatible clusterIDs。原因是hdfs namenode -format格式化了 NameNode 的元数据但 DataNode 的数据目录仍是旧的 clusterID。解决方式是按顺序清理并重建# 停掉所有服务 stop-all.sh # 删除 Hadoop 临时目录 rm -rf /usr/local/hadoop/tmp # 重新格式化 hdfs namenode -format # 重启 start-dfs.sh start-yarn.sh提示namenode -format只能执行一次以后每次启动集群都不要再格式化。只要执行过一次就相当于丢掉了 HDFS 上的所有数据实验数据需要重新put。5.2 YARN 作业提交后卡在 ACCEPTED 状态hadoop jar提交后终端一直打印Running job浏览器上 ResourceManager 界面显示状态为ACCEPTED对应问题是 Container 无法分配到资源。查看yarn-site.xml的内存配置property nameyarn.nodemanager.resource.memory-mb/name value4096/value /property property nameyarn.scheduler.minimum-allocation-mb/name value512/value /property property nameyarn.scheduler.maximum-allocation-mb/name value2048/value /property参数说明nodemanager.resource.memory-mb是物理机的总可用内存如果设成 4096 但虚拟机只有 2GB 内存Container 永远起不来。minimum-allocation-mb是单个 Container 的最小内存如果任务默认申请 1024MB 但最大值只有 512MB同样会卡住。实验环境里我一般把最大值和 NodeManager 总内存调整到同一水平避免资源碎片。5.3 Hive 查询报 ClassNotFoundExceptionHive 3.x 配合 Hadoop 3.x 时运行SELECT经常报ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf原因是 Hive 的 lib 目录没有加入 Hadoop 的AUX_CLASSPATH。在$HIVE_HOME/conf/hive-env.sh里加入export HADOOP_CLASSPATH$HADOOP_CLASSPATH:$HIVE_HOME/lib/*很多教材不会提这一步但因为是微课视频版视频里老师可能跳过了这个环境变量细节导致你看了半天报错不知道原因。注意$HIVE_HOME/lib/*末尾的星号不能省否则只加载 lib 目录本身而在 classpath 中没有 jar 包。6. 写好实验报告的三个进阶技巧6.1 截图要“带日志尾巴”而非只截成功界面实验报告的评分点在“可验证”。截图不是把SUCCEEDED几个字截下来就行要截到有价值的信息jps输出证明进程全部存活Web UI 的 DataNode 列表证明节点健康作业运行日志的尾部尤其要包含Map output records和Reduce input records两行这两行能证明数据确实经过了 Map 和 Reduce 两个阶段HDFS 上part-r-00000的实际内容比如下面这段日志就是截图标准素材Map-Reduce Framework Map input records25 Map output records70 Reduce input records70 Reduce output records45这四个数字是连贯的25 行输入 → 70 个单词 → 70 条记录进 Reduce → 45 个不重复单词输出。如果 map 输出为 0说明输入数据没被读进来多半是FileInputFormat路径写错了。6.2 用时间戳和参数表增加报告可信度实验报告里不要只写“我执行了命令”要带上执行时间和关键参数。比如记录 WordCount 作业时可以这样写项目内容作业 IDapplication_1688801234567_0001输入数据量25 行 / 1.2 KBMap 耗时12 秒含 JVM 启动Reduce 耗时8 秒容器分配内存1024 MB输出结果45 个单词及其计数作业 ID 可以从 YARN 日志的第一行看到这些数据不需要额外采集直接在终端复制即可。老师看报告时这组数据比“运行成功”四个字更有说服力。面试时被问到“这个任务跑多久”你也能直接答出量级而不是含糊地说“几分钟”。6.3 给排错过程写“对照式”记录实验报告最出彩的部分往往不是成功了什么而是失败了什么、怎么定位的。建议按“现象 → 日志 → 原因 → 解决”四段式记录一次完整排错过程比如 Connected 阶段报Connection refused日志里显示Call From localhost/127.0.0.1 to localhost:9000 failed on connection exception原因是没启动 NameNode 或端口被占用。用这个锅记录比任何教程都有辨识度。最后一道操作技巧在交付实验报告前把全部命令从历史记录中导出用history commands.txt留底再对照 PDF 的评分点逐项检查有没有漏截图。一份把自己“踩坑、定位、修复”的过程如实记录下来的实验报告既是对这门课的交代也是你做大数据组件排错能力的一手凭证。当你下次遇到 Container 起不来或副本数告警时随手翻翻自己写过的这份报告比重新搜索资料快得多。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。