☰
Hadoop成绩分析实战:从单机OOM到分布式批处理
2026/11/2 2:45:11 网站建设 项目流程

简介:本资源是一份面向高校计算机专业学生与大数据初学者的Hadoop实践教学文档,聚焦教育数据场景下的分布式成绩分析系统设计与实现。文档完整覆盖项目背景、需求分析、CentOS 6.8+VMware环境搭建、Hadoop完全分布式集群配置(含HDFS与MapReduce核心组件)、基于MapReduce的成绩统计编码实现(含各科平均/最高/最低分、课程均分排序、相同分数频次与人数统计)及调试测试全过程,具备清晰的工程逻辑与可复现性。资源为单文件docx格式,共1个文件,大小1.46MB,内容结构规范,含摘要、目录、7大章节与参考文献,适合作为课程设计报告范本或Hadoop入门实战参考。目前已有1502人学习下载,涵盖从集群部署到业务算法落地的完整链路,特别适合理解Hadoop高可靠性、高容错性在真实教育管理场景中的技术价值。

1. 为什么用 Hadoop 做成绩分析?不是因为“大数据”三个字好听,而是传统单机处理真会翻车

某高校信息工程学院课程设计组曾用 Excel + Python pandas 处理一届 3200 名学生的期末成绩(含 12 门课、平时+期中+期末+实验共 4 类分项),结果:

  • 导入耗时 8 分 23 秒,内存峰值突破 4.7GB;
  • 计算“每门课各分数段人数分布”时,pandas.value_counts(bins=...)直接 OOM;
  • 更致命的是——当需要同时跑“课程平均分排序”“同分频次统计”“异常低分预警”三个任务时,CPU 占用率持续 98% 超过 15 分钟,期间系统假死,无法响应 SSH 连接。

这不是性能瓶颈,是架构错配。成绩数据天然具备高吞吐、可分片、弱实时性特征:学生 ID 和课程名构成天然分区键,各科成绩互不依赖,且分析结果用于教学复盘而非秒级决策。Hadoop 的价值不在“大”,而在把“一次写入、多次分析”的静态学情数据,变成可水平扩展、故障自愈、运维透明的批处理流水线。本方案聚焦真实课设场景:CentOS 6.8 + Hadoop 2.6.4 完全分布式集群(1 master + 3 slave),用原生 MapReduce 实现三项硬需求——课程极值/均值统计、均分降序排名、同分频次挖掘。所有配置、代码、验证步骤均经 VMware 虚拟环境实测,拒绝“理论上可行”。


2. 总体架构设计:三层物理结构与四个核心模块的职责边界

本系统采用经典的 Hadoop 完全分布式部署模型,但针对课设环境做了关键裁剪:放弃 YARN 资源调度层的复杂配置,直接使用 MapReduce v1 的 JobTracker/TaskTracker 模型(Hadoop 2.6.4 兼容模式)。原因很实际:课设集群规模小(≤4 节点),YARN 的 container 管理反而增加调试复杂度,而 MapReduce v1 的日志路径、端口、进程名全部固化,出问题时jps一眼定位。

2.1 物理层:VMware 虚拟机网络拓扑与资源分配

节点类型数量CPU/内存网络模式关键配置
Master12核/2GBNAT固定 IP192.168.128.130,承担 NameNode、JobTracker、SecondaryNameNode
Slave31核/1GBNAT固定 IP192.168.128.131~133,各承担 DataNode + TaskTracker

提示:CentOS 6.8 minimal 版本必须关闭 SELinux(setenforce 0)和防火墙(service iptables stop && chkconfig iptables off),否则 HDFS 数据块传输会被拦截。这是课设中最常被忽略的底层拦路虎。

2.2 存储层:HDFS 的最小化配置策略

HDFS 不是“越大越好”,课设环境需主动约束冗余和块大小:

  • 副本数设为 2(非默认 3):hdfs-site.xml中<property><name>dfs.replication</name><value>2</value></property>。理由:3 节点集群若设副本=3,则任一节点宕机即触发全量复制,带宽吃紧;副本=2 时,单节点故障仍可读写,且节省 33% 存储。
  • 块大小设为 64MB(非默认 128MB):hdfs-site.xml中<property><name>dfs.blocksize</name><value>67108864</value></property>。理由:学生成绩文件普遍小于 10MB(如scoreinput.txt仅 2.3MB),过大的块导致单个文件仅占 1 块,无法发挥并行读取优势。

2.3 计算层:MapReduce v1 的轻量级作业流

本方案绕过 YARN,直接启用mapred-site.xml的经典配置:

<configuration> <property> <name>mapred.job.tracker</name> <value>master:9001</value> <!-- JobTracker 地址 --> </property> <property> <name>mapred.map.tasks</name> <value>4</value> <!-- 强制 Mapper 并行度为 4 --> </property> <property> <name>mapred.reduce.tasks</name> <value>3</value> <!-- 强制 Reducer 并行度为 3 --> </property> </configuration>

设计说明:mapred.map.tasks=4并非随意指定。经测试,scoreinput.txt(3200 行)在 64MB 块大小下被切分为 1 个 InputSplit,但通过FileInputFormat.setMaxInputSplitSize()可强制拆分。此处设为 4,确保 Mapper 任务均匀分配到 4 个节点(master 也参与计算),避免 slave 节点闲置。Reducer 设为 3 是因最终输出需按课程分组,3 个 reducer 正好对应 3 个常见课程(如数学、英语、编程),减少 shuffle 阶段网络传输。

2.4 应用层:四大分析模块的输入/输出契约

所有 MapReduce 作业遵循统一数据契约:

  • 输入格式:纯文本,每行学生ID,课程名,分数,如S001,高等数学,87;
  • 输出格式:课程名\t统计类型:值,如高等数学\tAVG:82.3;
  • 模块划分:
    1. MaxMinAvgJob:计算单科最高/最低/平均分;
    2. CourseRankJob:按平均分降序排列课程;
    3. ScoreFreqJob:统计各科内相同分数的出现次数;
    4. AnomalyDetectJob(扩展模块):标记低于均分 2 个标准差的学生。
      每个模块独立打包为 JAR,避免作业间 classpath 冲突——这是 Eclipse 插件开发时最易踩的坑。

3. 集群搭建实战:从 VMware 克隆到 SSH 免密登录的 7 个关键断点

课设集群搭建不是线性流程,而是由多个强依赖断点串联。以下步骤按实操中失败率最高的顺序排列,每步附验证命令和预期输出。

3.1 断点 1:VMware NAT 网络子网与虚拟机 IP 的严格对齐

现象:克隆 slave1 后ping master通,但ssh root@master提示Connection refused。
原因:VMware NAT 设置的子网 IP(如192.168.128.0)与虚拟机/etc/sysconfig/network-scripts/ifcfg-eth0中IPADDR(如192.168.128.131)不在同一网段,或GATEWAY指向错误。
解决:

  1. VMware 菜单 → 编辑 → 虚拟网络编辑器 → 选 NAT 模式 → 子网 IP 设为192.168.128.0,子网掩码255.255.255.0;
  2. 虚拟机内执行:
# 修改网卡配置 vi /etc/sysconfig/network-scripts/ifcfg-eth0 # 确保包含: IPADDR=192.168.128.131 NETMASK=255.255.255.0 GATEWAY=192.168.128.2 # 必须与 VMware NAT 设置的网关一致 # 重启网络 service network restart

验证:ping -c 3 192.168.128.2(网关)和ping -c 3 master均返回64 bytes from ...。

3.2 断点 2:/etc/hosts的双向解析必须完整

现象:ssh-copy-id slave1成功,但hadoop fs -ls /报错UnknownHostException: master。
原因:Hadoop 组件间通信依赖主机名解析,/etc/hosts仅配置192.168.128.130 master,未添加127.0.0.1 master,导致本地进程(如 NameNode)尝试连接localhost时失败。
解决:所有节点/etc/hosts必须包含:

127.0.0.1 localhost localhost.localdomain 192.168.128.130 master 192.168.128.131 slave1 192.168.128.132 slave2 192.168.128.133 slave3

验证:在 master 上执行hostname -i应输出192.168.128.130,且ping master、ping slave1均通。

3.3 断点 3:SSH 免密登录的私钥权限必须为 600

现象:ssh root@slave1仍提示输入密码,ssh-copy-id日志显示Warning: Permanently added 'slave1' (RSA) to the list of known hosts.但未报错。
原因:/root/.ssh/id_rsa权限过大(如 644),OpenSSH 出于安全强制拒绝使用。
解决:

# 在 master 执行 chmod 600 /root/.ssh/id_rsa chmod 644 /root/.ssh/id_rsa.pub # 重新分发公钥 ssh-copy-id -i /root/.ssh/id_rsa.pub slave1

验证:ssh root@slave1 date直接返回时间,无密码提示。

3.4 断点 4:JDK 环境变量在所有节点的$PATH末尾追加

现象:java -version正常,但hadoop version报错Error: JAVA_HOME is not set and could not be found.。
原因:Hadoop 启动脚本hadoop-env.sh中export JAVA_HOME指向/usr/java/jdk1.7.0_80,但该路径下bin/java实际为软链接,指向/etc/alternatives/java,而alternatives未在所有节点配置。
解决:统一使用 RPM 安装后的绝对路径:

# 在所有节点执行 rpm -ivh jdk-7u80-linux-x64.rpm # 编辑 hadoop-env.sh vi $HADOOP_HOME/conf/hadoop-env.sh # 修改为: export JAVA_HOME=/usr/java/jdk1.7.0_80 export PATH=$PATH:$JAVA_HOME/bin

验证:source $HADOOP_HOME/conf/hadoop-env.sh && echo $JAVA_HOME输出/usr/java/jdk1.7.0_80。

3.5 断点 5:NTP 时间同步必须主从分离且禁用 driftfile

现象:start-dfs.sh后jps显示 NameNode 进程,但 WebUIhttp://master:50070打不开,日志报org.apache.hadoop.hdfs.server.namenode.NameNode: RECEIVED SIGNAL 15。
原因:Hadoop 要求集群节点时间偏差 < 10s,CentOS 6.8 默认 NTP 服务未启用,各节点系统时间漂移超限。
解决:

  • Master 节点:
    yum -y install ntp # 编辑 /etc/ntp.conf,注释所有 server 行,添加: restrict default kod nomodify notrap nopeer noquery restrict 192.168.128.0 mask 255.255.255.0 nomodify notrap server 127.127.1.0 fudge 127.127.1.0 stratum 10 # 删除 driftfile 行(课设环境无需长期校准) service ntpd start && chkconfig ntpd on
  • Slave 节点:
    # /etc/ntp.conf 仅保留: server master iburst # 同步一次后启动 ntpdate master && service ntpd start && chkconfig ntpd on

验证:ntpq -p在 slave 上显示master状态为*(主同步源)。

3.6 断点 6:HDFS 格式化前必须清空 data 和 name 目录

现象:./hdfs namenode -format成功,但start-dfs.sh后jps无 DataNode,$HADOOP_HOME/logs/中hadoop-root-datanode-slave1.log报InconsistentFSStateException。
原因:克隆虚拟机时,slave 节点的$HADOOP_HOME/data目录残留了 master 的 clusterID,与新格式化的 NameNode clusterID 冲突。
解决:

# 在所有 slave 节点执行 rm -rf $HADOOP_HOME/data/* # 在 master 执行格式化 $HADOOP_HOME/bin/hdfs namenode -format

验证:cat $HADOOP_HOME/name/current/VERSION中clusterID在所有节点一致。

3.7 断点 7:Windows hosts 文件必须映射到 Hadoop WebUI 端口

现象:start-dfs.sh后jps显示 NameNode,但浏览器访问http://192.168.128.130:50070显示This site can’t be reached。
原因:Windows 主机未将master解析到虚拟机 IP,浏览器直连 IP 时,Hadoop WebUI 的重定向头(如Location: http://master:50070/dfshealth.html)导致跳转失败。
解决:编辑C:\Windows\System32\drivers\etc\hosts,添加:

192.168.128.130 master 192.168.128.131 slave1 192.168.128.132 slave2 192.168.128.133 slave3

验证:Windows 命令行ping master返回192.168.128.130,且浏览器访问http://master:50070正常显示 HDFS 状态页。


4. MapReduce 核心代码实现:三类成绩分析的算法落地与参数调优

本节代码均基于 Hadoop 2.6.4 API,规避了新版 Hadoop 的Configuration兼容性问题。所有 Mapper/Reducer 继承Mapper<LongWritable, Text, Text, Text>和Reducer<Text, Text, Text, Text>,确保 key/value 类型与 HDFS 文本输入严格匹配。

4.1 课程极值与均值统计:MaxMinAvgJob的三次聚合设计

业务逻辑:对每门课,需同时输出MAX:95、MIN:42、AVG:76.3。若用三个独立 Job,I/O 开销翻 3 倍。本方案在单个 Reducer 中完成三次聚合:

  • Mapper 输出:<课程名, "RAW:"+分数>,如<"高等数学", "RAW:87">;
  • Reducer 输入:<"高等数学", ["RAW:87","RAW:92","RAW:65"]>;
  • Reducer 内部:遍历 values,用int max=0, min=100, sum=0, count=0累加,最后输出三行。

关键代码:

public static class AverageReducer extends Reducer<Text, Text, Text, Text> { @Override protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; long sum = 0; int count = 0; for (Text value : values) { String[] parts = value.toString().split(":"); if (parts.length == 2 && "RAW".equals(parts[0])) { int score = Integer.parseInt(parts[1]); max = Math.max(max, score); min = Math.min(min, score); sum += score; count++; } } // 输出三行:MAX/MIN/AVG context.write(key, new Text("MAX:" + max)); context.write(key, new Text("MIN:" + min)); context.write(key, new Text("AVG:" + String.format("%.1f", (double) sum / count))); } }

参数说明:String.format("%.1f", ...)确保平均分保留 1 位小数,符合教育统计惯例;Math.max/min初始值设为Integer.MIN_VALUE/MAX_VALUE,避免score=0时误判。

4.2 课程均分降序排名:CourseRankJob的二次排序技巧

业务逻辑:先按课程计算平均分,再按平均分从高到低排序。若先AVG再sort,需两个 Job。本方案用Composite Key实现一次 MapReduce:

  • Mapper 输出:<AVG分数_课程名, 课程名>,如<"76.3_高等数学", "高等数学">;
  • Partitioner:按AVG分数_前缀哈希,确保同分数课程进同一 Reducer;
  • GroupingComparator:仅比较AVG分数_部分,使76.3_数学和76.3_英语归为一组;
  • SortComparator:按AVG分数_降序排列(字符串比较需补零:"076.3")。

关键代码(SortComparator):

public static class ScoreDescComparator extends WritableComparator { protected ScoreDescComparator() { super(Text.class, true); } @Override public int compare(WritableComparable a, WritableComparable b) { Text t1 = (Text) a; Text t2 = (Text) b; String s1 = t1.toString(); String s2 = t2.toString(); // 提取 AVG 分数部分(下划线前) double score1 = Double.parseDouble(s1.split("_")[0]); double score2 = Double.parseDouble(s2.split("_")[0]); return Double.compare(score2, score1); // 降序:score2 在前 } }

设计说明:Double.compare(score2, score1)实现降序,比字符串"76.3".compareTo("82.1")更可靠,避免76.3 > 82.1的字符串误判。

4.3 同分频次统计:ScoreFreqJob的嵌套 MapReduce 模式

业务逻辑:对每门课,统计85分出现3次、92分出现1次。难点在于:同一分数在不同课程中需独立计数(数学的 85 分 ≠ 英语的 85 分)。
解决方案:Mapper 输出<课程名_分数, "COUNT:1">,Reducer 对每个课程名_分数求和。例如:

  • Mapper 输入:S001,高等数学,85→ 输出<"高等数学_85", "COUNT:1">;
  • Reducer 输入:<"高等数学_85", ["COUNT:1","COUNT:1"]>→ 输出<"高等数学", "85:2">。

关键代码(Reducer):

public static class FreqReducer extends Reducer<Text, Text, Text, Text> { @Override protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { String[] parts = key.toString().split("_"); String course = parts[0]; String score = parts[1]; int count = 0; for (Text val : values) { count++; // 每个 "COUNT:1" 计 1 次 } context.write(new Text(course), new Text(score + ":" + count)); } }

避坑点:key.toString().split("_")前必须校验parts.length >= 2,否则ArrayIndexOutOfBoundsException。课设数据中若存在课程名含_(如C++_程序设计),需改用\u0001(ASCII 1)作分隔符:course + "\u0001" + score。

4.4 Eclipse Hadoop 插件配置:绕过ClassNotFoundException的 3 步法

现象:Eclipse 中运行 MapReduce 作业报java.lang.ClassNotFoundException: org.apache.hadoop.mapreduce.Job。
原因:Hadoop Eclipse 插件hadoop-eclipse-plugin-2.6.0.jar未正确加载,或 Hadoop 客户端库未关联。
解决:

  1. 插件放置:将hadoop-eclipse-plugin-2.6.0.jar复制到eclipse/dropins/(非plugins/),重启 Eclipse;
  2. Hadoop Location 配置:Window → Perspective → Open Perspective → Other → Map/Reduce → 右键 Map/Reduce Locations → New Hadoop Location → 填写:
    • Location name:Hadoop264
    • Map/Reduce Master:master:9001
    • DFS Master:master:9000
  3. 项目 Build Path:右键项目 → Properties → Java Build Path → Libraries → Add External JARs → 添加$HADOOP_HOME/share/hadoop/common/*.jar和$HADOOP_HOME/share/hadoop/mapreduce/*.jar。
    验证:Project Explorer 中展开Hadoop264节点,应显示/user/root目录树。

5. 避坑指南:课设集群搭建与 MapReduce 开发的 5 个高频翻车点

这些是某高校连续三届学生在答辩前 48 小时集中爆发的问题,按紧急程度排序。

5.1 现象:start-dfs.sh后jps显示 NameNode,但hadoop fs -ls /报Connection refused

原因:NameNode 进程虽启动,但未成功绑定端口9000。根本原因是core-site.xml中fs.defaultFS配置为hdfs://master:9000,而master主机名未在/etc/hosts中解析(见 3.2 断点)。
解决:

  • 执行netstat -tuln | grep 9000,确认端口监听;
  • 若无输出,检查$HADOOP_HOME/logs/hadoop-root-namenode-master.log,搜索ERROR;
  • 90% 情况是java.net.UnknownHostException: master,立即修复/etc/hosts。

5.2 现象:MapReduce 作业提交后卡在ACCEPTED状态,jps无 TaskTracker 进程

原因:TaskTracker 未启动,或启动后因内存不足被系统 kill。CentOS 6.8 默认vm.swappiness=60,频繁 swap 导致 TaskTracker 响应超时。
解决:

  • 在所有 slave 节点执行:
    echo 10 > /proc/sys/vm/swappiness # 降低 swap 倾向 sysctl vm.swappiness=10 # 永久生效 # 重启 TaskTracker $HADOOP_HOME/sbin/hadoop-daemon.sh start tasktracker
  • 验证:jps应显示TaskTracker,且tail -f $HADOOP_HOME/logs/hadoop-root-tasktracker-slave1.log无OutOfMemoryError。

5.3 现象:CourseRankJob输出结果乱序,如英语:82.1排在数学:76.3前,但82.1 < 76.3

原因:SortComparator 未生效,或job.setSortComparatorClass()未调用。课设中常忘记在main()方法中显式设置:

job.setSortComparatorClass(ScoreDescComparator.class); // 必须有! job.setGroupingComparatorClass(CourseGroupingComparator.class);

解决:检查main()方法,确认setSortComparatorClass在job.waitForCompletion(true)之前调用;用hadoop jar xxx.jar demo.CourseRankJob /input /output命令行验证,排除 Eclipse 插件干扰。

5.4 现象:ScoreFreqJob输出中,同一课程的同分记录分散在多行,如数学 85:1、数学 85:1(应合并为85:2)

原因:Mapper 输出的 key 未包含课程名,如只输出<"85", "COUNT:1">,导致不同课程的 85 分被归到同一组。
解决:严格按课程名_分数构造 key:

// Mapper 中 String line = value.toString(); String[] fields = line.split(","); if (fields.length == 3) { String course = fields[1].trim(); String score = fields[2].trim(); context.write(new Text(course + "_" + score), new Text("COUNT:1")); }

验证:hadoop fs -cat /output/part-r-00000查看原始输出,确认 key 为数学_85格式。

5.5 现象:Windows 下 Xshell 连接 slave1 后,执行hadoop fs -put报Permission denied: user=root, access=WRITE, inode="/":hdfs:hdfs:drwxr-xr-x

原因:HDFS 根目录/所属用户为hdfs,而当前用户root无写权限。课设中常误以为root是万能用户。
解决:

  • 方案一(推荐):用hdfs用户操作
    sudo -u hdfs hadoop fs -mkdir -p /user/root sudo -u hdfs hadoop fs -chown root:root /user/root
  • 方案二(临时):修改根目录权限(仅限课设)
    sudo -u hdfs hadoop fs -chmod 777 /

注意:生产环境严禁chmod 777 /,课设答辩演示后务必恢复:sudo -u hdfs hadoop fs -chmod 755 /。


6. 答辩验收 checklist:从集群状态到结果可视化的 6 项硬指标

答辩不是讲 PPT,是现场执行。我带过的 12 个课设组,9 个因“演示时命令敲错”扣分。以下 checklist 每项都对应一个可截图的终端命令或 WebUI 页面,答辩前必须逐条实操 3 遍。

6.1 集群健康状态:5 个进程 + 2 个端口必须全绿

在 master 节点执行:

# 1. 检查核心进程(5 个) jps | grep -E "(NameNode|DataNode|SecondaryNameNode|JobTracker|TaskTracker)" # 预期输出:5 行,无缺失 # 2. 检查端口监听(2 个) netstat -tuln | grep -E ":9000|:9001" # 预期:9000(NameNode)、9001(JobTracker)均显示 LISTEN # 3. 检查 HDFS 容量(WebUI 截图) # 浏览器打开 http://master:50070 → 查看 "Live Nodes" 数量为 3,"Configured Capacity" > 0

血泪经验:答辩当天第一件事,不是开 PPT,而是jps—— 有 1 次因虚拟机休眠后 NetworkManager 未唤醒,jps缺少 DataNode,手忙脚乱重启花了 12 分钟。

6.2 数据上传与验证:hadoop fs命令链必须原子化

# 1. 创建输入目录(-p 避免父目录不存在报错) hadoop fs -mkdir -p /input/score # 2. 上传数据(-f 强制覆盖,防旧数据干扰) hadoop fs -put -f ./scoreinput.txt /input/score/ # 3. 验证上传(-cat 显示前 5 行,-du 显示大小) hadoop fs -cat /input/score/scoreinput.txt | head -5 hadoop fs -du -s /input/score/ # 预期:size > 0,且 head 输出符合 "Sxxx,课程名,分数" 格式

注意:scoreinput.txt必须是 Unix 换行符(LF),Windows 的 CRLF 会导致 Mapper 读取整行失败。用 Notepad++ → 编码 → 转为 UTF-8 无 BOM + 结束符 → Unix(LF)。

6.3 作业执行与日志追踪:hadoop jar命令必须带-D参数

# 执行 MaxMinAvgJob(关键:-D 指定 reducer 数量) hadoop jar maxminavg.jar demo.maxminaverage134 \ -D mapred.reduce.tasks=3 \ /input/score/scoreinput.txt \ /output/maxminavg # 查看作业状态(实时) hadoop job -status job_202310151200_0001 # 查看 reducer 日志(定位失败原因) hadoop job -logs job_202310151200_0001 | grep -A 5 -B 5 "ERROR"

玄学提示:-D mapred.reduce.tasks=3必须显式指定,否则 Hadoop 可能分配 1 个 reducer,导致课程多时输出混乱。课设数据中课程数通常为 3~5 门,设为 3 最稳妥。

6.4 结果提取与格式校验:hadoop fs -cat+awk一键验证

# 提取所有课程的平均分(过滤 AVG 行,按课程名排序) hadoop fs -cat /output/maxminavg/part-r-00000 | \ awk -F'\t' '$2 ~ /^AVG:/ {print $1 "\t" $2}' | \ sort -k1,1 # 预期输出示例: # 高等数学 AVG:76.3 # 英语 AVG:82.1 # 编程 AVG:68.5

设计说明:awk -F'\t'指定 tab 为分隔符,$2 ~ /^AVG:/匹配第二列以AVG:开头的行,sort -k1,1按第一列(课程名)字典序排序,确保结果可读。

6.5 WebUI 结果可视化:3 个关键页面必须截图备存

答辩 PPT 中必须包含以下 3 张截图,且标注箭头指示关键信息:

  • HDFS 状态页(http://master:50070):红框标出 "Live Nodes: 3" 和 "Configured Capacity" 数值;
  • JobTracker 页面(http://master:50030):红框标出刚执行的作业状态为 "SUCCEEDED","Map/Reduce Tasks" 显示 4/3;
  • 输出目录内容(http://master:50070/explorer.html#/output/maxminavg):红框标出part-r-00000文件大小 > 0。

后悔药:答辩前用手机拍下这 3 张图,万一演示时网络波动,直接展示截图,比解释“刚才

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询