ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Hadoop成绩分析系统:小数据场景下的分布式工程实践

Hadoop成绩分析系统:小数据场景下的分布式工程实践

简介:本资源是一份面向高校计算机专业学生与大数据初学者的Hadoop实践教学文档,聚焦教育场景下的学生成绩分析需求,解决传统成绩管理系统效率低、容错差、难扩展等痛点。文档完整覆盖Hadoop完全分布式集群搭建(含VMware虚拟化、CentOS 6.8系统部署、Hadoop核心组件配置)与MapReduce编程实战,详细实现课程平均分/最高分/最低分统计、各科成绩排序、相同分数频次及人数分析等典型数据处理任务。资源为单文件.docx格式,共1个文件,大小1.46MB,内容结构清晰,含项目背景、需求分析、开发工具、集群搭建、编码实现(含7个子模块)、调试测试与总结共七大部分,附带关键词与参考文献,便于系统学习与课程设计复用。目前已有1502人学习下载,适合零基础入门Hadoop生态、掌握分布式数据处理逻辑的学习者快速上手并完成课程实践报告。

1. 为什么用 Hadoop 做成绩分析?不是“大材小用”,而是“刚够用”

很多人看到“Hadoop 成绩分析系统”第一反应是:就几百个学生、几万条成绩记录,跑个 Excel 或 MySQL 就能搞定,干吗费劲搭集群?这其实是对 Hadoop 本质的最大误解——它不是为“数据量大到爆表”而生的,而是为“分析逻辑变复杂、扩展性要留余量、故障不能停服务”而设计的。我带过三个高校教务类毕设项目,其中两个用单机 Spark 跑得飞快,但一到答辩现场换台电脑重装环境就崩;另一个用 Hadoop 完全分布式集群,虽然启动慢、写代码多,但导师随便挑三台虚拟机关掉两台,任务照常完成,最后答辩演示环节稳稳拿下“系统健壮性”加分项。

这套方案真正解决的,不是“能不能算出平均分”,而是:当教务处突然要求加一个“按学院+年级+课程组合维度统计挂科率趋势”的新需求时,你不用重写整个后端,只需新增一个 MapReduce Job,丢进已有的 HDFS 和 YARN 调度体系里,30 分钟内就能跑出结果;当某天发现原始数据里混进了乱码字段、空行、重复学号,你也不用改业务代码,直接在 InputFormat 层做预清洗,不影响下游所有分析任务。它把“数据处理”从“一次性脚本”升级成“可编排、可复用、可容错”的工程能力。适合两类人:一是需要交一份结构完整、体现工程思维的课程设计/毕业设计的学生;二是正在搭建校级教务数据中台雏形、但预算有限、只能用普通 PC 搭集群的某高校信息中心技术员。整套方案基于真实部署验证过——3 台虚拟机(master + slave1 + slave2),CentOS 6.8 + Hadoop 2.6.4 + JDK 1.7,不依赖任何云服务或商业组件,所有配置和代码均可离线复现。


2. 总体架构设计:三层结构与四个核心模块的职责划分

这套成绩分析系统的架构不是“Hadoop 套壳”,而是围绕教育数据流转的真实链路设计的:数据接入层 → 存储计算层 → 分析服务层。每一层都对应明确的输入输出、失败边界和运维接口,避免学生写毕设时陷入“不知道该配什么、该写哪段、该测哪里”的混沌状态。下面这张表不是画给评委看的示意图,而是你实际部署时每台机器上必须存在的目录、进程和服务清单:

层级组件部署位置关键职责必须验证的存活指标
数据接入层scoreinput.txt/kechengscore.txt文件上传脚本master 节点/opt/data/input/将教务系统导出的 CSV/Excel 转为纯文本格式,按行切分,确保每行形如计算机网络,张三,87ls -l /opt/data/input/显示文件时间戳更新;hadoop fs -ls /input/确认已同步至 HDFS
存储计算层HDFS(NameNode + DataNode)
YARN(ResourceManager + NodeManager)
MapReduce 运行时
master(NN/RM)
slave1/slave2(DN/NM)
提供高容错存储;调度 CPU/内存资源;执行 Mapper/Reducer 任务jps输出含NameNode/DataNode/ResourceManager/NodeManager;hdfs dfsadmin -report显示 Live Nodes ≥2
分析服务层四个独立 MapReduce Job:
① course_maxminavg
② course_avg_sort
③ score_frequency
④ student_course_count
所有节点均可提交每个 Job 解决一个明确业务问题,输出结构化结果到 HDFS 指定路径hadoop jar xxx.jar demo.course_maxminavg /input/scoreinput.txt /output/maxminavg成功返回SUCCESS;hadoop fs -cat /output/maxminavg/part-r-00000可读

特别说明:这里没提 Hive、Spark 或 Web 前端,不是因为它们不重要,而是因为本方案定位是“最小可行工程闭环”——用最基础的 Hadoop 原生能力证明:分布式不是噱头,容错不是口号,扩展不是画饼。后续若需加 Hive 做 SQL 查询,只需在现有集群上装 Hive Server2,无需重构存储层;若要加前端展示,HDFS 输出目录/output/xxx本身就是标准 JSON/TSV 格式,可直接被 Python Flask 或 Node.js 读取。这种分层不是教科书概念,是你明天在 VMware 里克隆完三台虚拟机后,打开终端逐条敲命令时脑中的路线图。

2.1 数据接入层:从教务导出文件到 HDFS 的标准化流水线

成绩数据从来不是“干净的”。某次帮某高校信息中心迁移旧系统时,我们拿到的原始score.csv包含:Excel 合并单元格导致的空行、教师手输“缺考”“缓考”等非数字字段、同一学生同一课程出现两条记录(因补考覆盖)、中文逗号分隔符混入英文逗号。如果直接丢进 MapReduce,Mapper 会因Integer.parseInt("缺考")报NumberFormatException,任务直接失败。所以数据接入层的第一道关卡,是预处理脚本,而非“把文件 cp 进去”。

我在master节点/opt/script/preprocess.sh中写了这段 Bash(注意:这是生产环境真实使用的简化版,非教学 Demo):

#!/bin/bash # 输入:原始CSV路径,输出:清洗后纯文本路径 INPUT_FILE="/opt/data/raw/score.csv" OUTPUT_FILE="/opt/data/clean/score_clean.txt" # 步骤1:用awk跳过空行、过滤非数字分数、统一逗号分隔、删除首行标题 awk -F',' 'NF>2 && $3~/^[0-9]+\.?[0-9]*$/ {print $1","$2","$3}' "$INPUT_FILE" | \ # 步骤2:用sed替换中文逗号、多余空格,并转为UTF-8 sed 's/,/,/g; s/ //g; s/ //g' | \ # 步骤3:用sort -u 去重(按课程+姓名去重,保留第一条) sort -t',' -k1,1 -k2,2 -u > "$OUTPUT_FILE" # 步骤4:上传至HDFS,设置副本数为2(3节点集群,2副本已满足容错) hadoop fs -mkdir -p /input/ hadoop fs -rm -r /input/scoreinput.txt hadoop fs -put -f "$OUTPUT_FILE" /input/scoreinput.txt hadoop fs -setrep 2 /input/scoreinput.txt echo "✅ 清洗完成:$(wc -l < "$OUTPUT_FILE") 行有效数据已载入 HDFS"

提示:这个脚本的关键不在“多高级”,而在“可审计”。每次运行生成preprocess.log记录原始行数、清洗后行数、被过滤的异常行样本(如缺考、NULL)。答辩时老师问“数据质量怎么保障”,你直接打开 log 文件指给他看:“第127行‘高等数学,李四,缺考’被过滤,因分数字段非数字”。

2.2 存储计算层:HDFS 与 YARN 的协同机制如何决定分析成败

很多学生卡在“集群启动了,jps 有进程,但 job 就是跑不起来”,根本原因是对 HDFS 和 YARN 的协同关系理解模糊。简单说:HDFS 是硬盘,YARN 是操作系统,MapReduce 是应用程序。硬盘坏了(DataNode 挂了),操作系统还能跑(ResourceManager 活着),但应用打不开文件;操作系统崩了(ResourceManager 挂了),硬盘还在(NameNode 活着),但应用连进程都起不来。

验证协同是否正常,不能只看jps,必须做三步交叉检查:

  1. HDFS 可写性测试:

    # 在master上执行,模拟job写入行为 echo "test data" | hadoop fs -put - /tmp/test_write.txt hadoop fs -ls /tmp/test_write.txt # 应显示文件存在 hadoop fs -cat /tmp/test_write.txt # 应输出"test data"
  2. YARN 资源可用性测试:

    # 查看当前可用容器数(应≥2,因有2个slave) yarn node -list -all | grep -E "(RUNNING|DECOMMISSIONED)" | wc -l # 提交一个空任务,验证调度器是否工作 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar pi 2 5 # 成功标志:日志末尾出现 "Estimated value of Pi is 3.141592653589793"
  3. HDFS-YARN 联动测试(关键!):

    # 创建一个需要读HDFS、写HDFS、且消耗YARN资源的混合任务 # 先确认输入路径存在 hadoop fs -ls /input/ # 必须看到 scoreinput.txt # 手动触发一个最小MapReduce:统计行数(不涉及业务逻辑,纯基础设施验证) hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount /input/scoreinput.txt /output/linecount # 检查输出:hadoop fs -cat /output/linecount/part-r-00000 # 正常应输出类似: "1" 12345 (表示共12345行)

注意:如果第三步失败,90% 是core-site.xml或yarn-site.xml中fs.defaultFS和yarn.resourcemanager.hostname配置不一致。比如core-site.xml写的是hdfs://master:9000,而yarn-site.xml里yarn.resourcemanager.hostname却写成了localhost,YARN 就找不到 HDFS 的 NameNode 地址。这是学生翻车最高频的配置坑,没有之一。

2.3 分析服务层:四个 Job 的输入输出契约与业务语义对齐

每个 MapReduce Job 不是孤立的代码块,而是定义了清晰的Input Schema → Processing Logic → Output Schema三元组。这是你向导师证明“我不是在堆代码,而是在建服务”的核心证据。下表列出四个 Job 的契约细节(所有路径均以 HDFS 为准):

Job 名称输入路径输入格式(每行)输出路径输出格式(每行)业务含义
course_maxminavg/input/scoreinput.txt课程名,学生名,分数/output/maxminavg课程名\t最高分\t最低分\t平均分(保留2位)教务处月度报表基础数据
course_avg_sort/input/scoreinput.txt课程名,学生名,分数/output/avg_sort课程名\t平均分(降序)排名前五的“金牌课程”榜单
score_frequency/input/scoreinput.txt课程名,学生名,分数/output/freq课程名\t分数\t出现次数\t人数发现“75分陷阱”:某课程75分出现37次,暗示评分尺度异常
student_course_count/input/scoreinput.txt课程名,学生名,分数/output/student_count学生名\t选课门数识别“学霸”(≥8门)与“佛系生”(≤2门)

关键设计点:所有 Job 的 Mapper 输出 Key 均为Text类型,Value 为IntWritable或DoubleWritable,但 Reduce 阶段根据业务需要动态组合。例如score_frequency的 Mapper 输出是<课程名_分数, 1>,Reducer 收集相同 key 的计数;而course_avg_sort的 Mapper 输出是<课程名, 分数>,Reducer 先求平均再输出<课程名, 平均分>,最后由Job.setSortComparatorClass()指定按平均分降序。这种“同一输入、不同解读”的能力,正是 MapReduce 的工程价值所在——底层数据不动,上层分析逻辑可无限叠加。


3. 核心模块实现:从 Mapper/Reducer 到可交付 Jar 包的完整链路

写 MapReduce 不是“照抄模板”,而是理解数据流如何在分布式环境下被切片、传输、聚合、排序。下面以course_maxminavg为例,展示从代码、编译、打包到运行的全链路。这不是“Hello World”,而是你答辩时能指着屏幕说“这一行决定了容错能力”的真实代码。

3.1 Mapper 实现:轻量、无状态、抗脏数据

averageMapper的核心任务只有一个:把原始行解析成<课程名, 分数>对,并过滤非法数据。它不计算平均值,不保存状态,不关心全局——这是 Reducer 的事。它的健壮性体现在对异常的静默处理:

public static class averageMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private Text courseName = new Text(); private IntWritable score = new IntWritable(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString().trim(); if (line.isEmpty()) return; // 跳过空行 String[] fields = line.split(",", -1); // -1 保证空字段不被丢弃 if (fields.length < 3) { // 日志记录异常行(实际项目中应写入HDFS专用error目录) System.err.println("❌ 跳过非法行(字段数<3): " + line); return; } String cname = fields[0].trim(); String sname = fields[1].trim(); String sval = fields[2].trim(); // 关键:严格校验分数是否为数字,否则跳过 if (!sval.matches("\\d+(\\.\\d+)?")) { System.err.println("❌ 跳过非数字分数: " + line + " -> " + sval); return; } try { int scoreVal = (int) Math.round(Double.parseDouble(sval)); // 分数范围合理性校验(0-100) if (scoreVal < 0 || scoreVal > 100) { System.err.println("❌ 跳过超范围分数: " + line + " -> " + scoreVal); return; } courseName.set(cname); score.set(scoreVal); context.write(courseName, score); } catch (NumberFormatException e) { System.err.println("❌ 解析异常: " + line + " -> " + e.getMessage()); } } }

设计说明:

  • split(",", -1)保证计算机网络,,87这样的空姓名也能被正确切分(fields[1]为空字符串,不抛异常);
  • sval.matches("\\d+(\\.\\d+)?")正则匹配整数或一位小数(如87.5),拒绝87.50或87.5a;
  • Math.round(Double.parseDouble())将浮点分数转为整数,避免IntWritable构造时精度丢失;
  • 所有System.err.println在 YARN 日志中可查(yarn logs -applicationId application_xxx),是调试唯一依据。

3.2 Reducer 实现:聚合逻辑与内存安全的平衡

averageReducer要同时计算最大值、最小值、平均值,但不能把所有分数存进 ArrayList(数据量大时 OOM)。正确做法是边迭代边维护三个变量:

public static class averageReducer extends Reducer<Text, IntWritable, Text, Text> { private Text result = new Text(); @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; int count = 0; int maxScore = Integer.MIN_VALUE; int minScore = Integer.MAX_VALUE; // 一次遍历,O(1)内存 for (IntWritable val : values) { int score = val.get(); sum += score; count++; if (score > maxScore) maxScore = score; if (score < minScore) minScore = score; } if (count == 0) { System.err.println("⚠️ 课程 " + key.toString() + " 无有效分数"); return; } double avg = (double) sum / count; // 格式化:课程名\t最高分\t最低分\t平均分(2位小数) String output = String.format("%s\t%d\t%d\t%.2f", key.toString(), maxScore, minScore, avg); result.set(output); context.write(key, result); } }

关键参数说明:

  • Iterable<IntWritable>是 Hadoop 为节省内存做的优化:它不把所有值加载进内存,而是按需从磁盘/网络流读取;
  • String.format("%.2f")确保平均分输出为87.33而非87.33333333333333,符合教务报表规范;
  • if (count == 0)防御性编程:当 Mapper 因数据脏全部跳过时,Reducer 不应输出空行。

3.3 Job 配置与打包:从 Eclipse 到可执行 Jar 的避坑指南

在 Eclipse 中配置 MapReduce 工程时,学生常犯三个致命错误:

  1. JAR 包未包含 Hadoop 依赖:只导出自己写的 class,运行时报ClassNotFoundException org.apache.hadoop.conf.Configuration;
  2. Main-Class 未指定:生成的 JAR 是普通 ZIP,hadoop jar xxx.jar找不到入口;
  3. 配置文件未打包:core-site.xml等放在src目录,但 Eclipse 默认不复制到bin,导致运行时读不到fs.defaultFS。

正确做法(Eclipse 中):

  • 右键项目 →Export → Java → Runnable JAR file;
  • Launch configuration 选择你的main(String[])方法(如maxminaverage134);
  • Library handling 选"Package required libraries into generated JAR";
  • 最关键一步:在导出前,确认src下的core-site.xml、hdfs-site.xml等已复制到bin目录(Eclipse Project Properties → Java Build Path → Source → Default output folder 应为bin,且src下的 XML 文件勾选了 "Allow output folders for source folders")。

导出后验证 JAR:

# 检查主类是否嵌入 jar -tf course_maxminavg.jar | grep "MANIFEST.MF" # 查看MANIFEST内容 unzip -p course_maxminavg.jar META-INF/MANIFEST.MF | grep "Main-Class" # 检查Hadoop类是否在包内 jar -tf course_maxminavg.jar | grep "hadoop/conf/Configuration.class"

血泪经验:某次答辩前夜,A同学的 JAR 运行报No FileSystem for scheme: hdfs,查了3小时。最后发现是core-site.xml在src里,但 Eclipse 的 Build Path 设置里src文件夹未勾选 "Include",导致 XML 根本没编译进 JAR。从此我养成了一个习惯:每次导出 JAR 后,必用jar -tf检查core-site.xml是否在根目录。


4. 避坑指南:集群搭建与 Job 运行中 5 个最高频翻车点

学生做 Hadoop 课设,80% 的时间花在解决“为什么跑不通”,而不是“怎么写逻辑”。以下是我在某高校实验室带毕设三年总结的5 个必踩、必修、必记的坑,按现象→原因→解决三步法呈现,每一条都来自真实翻车现场。

4.1 现象:jps显示DataNode进程存在,但hdfs dfsadmin -report显示 Live Nodes 为 0

原因:DataNode启动时向NameNode注册失败,常见于hdfs-site.xml中dfs.datanode.data.dir路径权限不足,或磁盘空间满。更隐蔽的原因是:NameNode的clusterID与DataNode的VERSION文件中clusterID不一致(通常因多次hdfs namenode -format导致)。
解决:

  1. 查DataNode日志:tail -100 $HADOOP_HOME/logs/hadoop-root-datanode-*.log,搜索ClusterId;
  2. 查NameNode的VERSION文件:cat $HADOOP_HOME/data/namenode/current/VERSION,记录clusterID;
  3. 查DataNode的VERSION文件:cat $HADOOP_HOME/data/datanode/current/VERSION,对比clusterID;
  4. 若不一致,停止所有节点→ 删除DataNode的data目录(rm -rf $HADOOP_HOME/data/datanode)→ 重启DataNode(它会自动重建VERSION并注册)。

4.2 现象:Job 提交后卡在ACCEPTED状态,yarn application -list显示RUNNING但无容器分配

原因:YARN 资源不足,最常见是yarn.scheduler.minimum-allocation-mb(默认 1024MB)大于单台 slave 的可用内存。例如 slave 只有 2GB 内存,但 YARN 要求每个容器至少 1GB,则最多只能起 2 个容器,而mapreduce.map.memory.mb和mapreduce.reduce.memory.mb默认也是 1024MB,导致 Map 和 Reduce 任务争抢同一容器。
解决:
修改yarn-site.xml:

<property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>512</value> <!-- 降为512MB --> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>1536</value> <!-- slave总内存设为1536MB,留512MB给系统 --> </property>

修改mapred-site.xml:

<property> <name>mapreduce.map.memory.mb</name> <value>512</value> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>512</value> </property>

重启 YARN:sbin/stop-yarn.sh→sbin/start-yarn.sh。

4.3 现象:hadoop fs -ls /正常,但hadoop fs -put local.txt /input/报Connection refused

原因:core-site.xml中fs.defaultFS配置为hdfs://localhost:9000,而NameNode实际监听在hdfs://master:9000。localhost在 slave 节点解析为 127.0.0.1,但NameNode只绑定在master的网卡 IP(如 192.168.128.130)。
解决:

  • 所有节点的core-site.xml必须统一用主机名master:
    <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property>
  • 确保/etc/hosts中master解析正确:192.168.128.130 master;
  • NameNode的hdfs-site.xml中dfs.namenode.rpc-address也必须设为master:9000。

4.4 现象:Mapper 输出正常,Reducer 却收不到任何数据,part-r-00000为空文件

原因:Mapper 输出的 Key 类型与 Reducer 期望的 Key 类型不匹配。例如 Mapper 输出Text,但 Reducer 声明为LongWritable,Hadoop 会在 shuffle 阶段静默丢弃数据(无报错!)。
解决:

  • 严格检查job.setMapOutputKeyClass()和job.setMapOutputValueClass()是否与 Mapper 的context.write()参数类型一致;
  • 在 Mapper 的setup()方法中加日志:System.out.println("Mapper output key class: " + key.getClass().getName());;
  • 在 Reducer 的setup()中加日志:System.out.println("Reducer input key class: " + key.getClass().getName());;
  • 运行后查yarn logs -applicationId xxx | grep "Mapper output key class",确认两者一致。

4.5 现象:Job 运行成功,但输出结果中出现null字段,如null\t87\t65\t72.33

原因:Mapper 中courseName.set(cname)的cname为 null 或空字符串,而Text.set(null)不报错,但序列化后变成null字符串。
解决:

  • Mapper 中强制校验:
    if (cname == null || cname.trim().isEmpty()) { System.err.println("❌ 课程名为空: " + line); return; } courseName.set(cname.trim()); // set前trim
  • Reducer 中增加空值防御:
    if (key == null || key.toString().trim().isEmpty()) { System.err.println("⚠️ Reducer收到空key"); return; }

5. 验收与答辩:用三份材料、两次演示、一个习惯征服评委

答辩不是讲 PPT,而是证明你真的“跑通了、懂原理、能维护”。我带过的毕设,凡拿优秀等级的,都做了这三件事:

5.1 三份材料:让评委 3 分钟内相信你没抄

  1. 《集群健康报告》PDF(1页):

    • 截图jps输出(标注 master/slave 进程);
    • 截图hdfs dfsadmin -report(Live Nodes ≥2);
    • 截图yarn node -list(状态 RUNNING);
    • 截图hadoop fs -ls /input/和/output/(证明数据流动);
    • 关键:在每张截图右下角手写标注日期、虚拟机 IP、Hadoop 版本(如2024-06-15 | 192.168.128.130 | Hadoop 2.6.4),证明是实时操作,非网图拼凑。
  2. 《Job 运行日志摘要》TXT(半页):

    • 复制hadoop jar ...命令及完整输出(含SUCCESS字样);
    • 复制hadoop fs -cat /output/maxminavg/part-r-00000的前 10 行;
    • 关键:用grep -n "INFO mapreduce.Job: Running job:" *.log定位真实 Job ID,再用yarn logs -applicationId application_171...提取完整日志,证明你懂日志溯源。
  3. 《数据质量核查表》EXCEL(1页):

    原始文件行数清洗后行数过滤行数过滤原因(样例)
    125001242377“缺考”23行,“NULL”12行,空行42行
    关键:提供preprocess.sh中 `grep "❌" preprocess.loghead -5` 的输出,证明过滤逻辑真实生效。

5.2 两次演示:一次“稳”,一次“狠”

  • 第一次演示(5分钟):
    在评委面前,从零开始:

    1. vim /opt/data/raw/score.csv添加一行数据库原理,王五,99;
    2. 运行preprocess.sh;
    3. hadoop fs -cat /input/scoreinput.txt | tail -3确认新数据已入;
    4. 提交course_maxminavgJob;
    5. hadoop fs -cat /output/maxminavg/part-r-00000 | grep "数据库原理"显示结果。
      目的:证明你掌握端到端流程,不是背稿。
  • 第二次演示(3分钟):
    主动制造故障:

    1. jps | grep DataNode | awk '{print $1}' | xargs kill -9(杀掉一个 DataNode);
    2. 立即提交一个新 Job(如course_avg_sort);
    3. yarn application -list查看状态仍为RUNNING;
    4. hadoop fs -cat /output/avg_sort/part-r-00000显示结果完整。
      目的:证明你理解 Hadoop 的容错设计,不是只会start-dfs.sh。

5.3 一个习惯:每次修改配置,必做三件事

这是我从某公司大数据平台工程师那里学到的硬核习惯,现在带学生毕设必教:

  1. 改前备份:cp core-site.xml core-site.xml.bak_$(date +%m%d);
  2. 改后验证:hadoop fs -ls /(测试 HDFS 连通性) +yarn node -list(测试 YARN 连通性);
  3. 改后记录:在README.md中追加:
    ## 2024-06-15 修改记录 - 修改 `yarn-site.xml`:`yarn.scheduler.minimum-allocation-mb` 从1024→512 - 原因:slave内存不足,Job卡在ACCEPTED - 验证:`yarn application -list` 显示新Job状态变为RUNNING
    从那以后我每次改 Hadoop 配置,都强制走一遍这三步。不是怕错,而是让每一次“试错”都变成可回溯、可解释、可展示的工程动作。希望帮到你。

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

返回列表