MapReduce 实战详解:学生成绩统计案例

一、MapReduce 概述

1. 定义

MapReduce 是一种分布式并行计算的编程模型与框架,由 Google 提出核心思想,Apache Hadoop 进行开源实现,是大数据离线批量处理的核心技术。它专门解决海量数据(TB/PB 级别)的高效处理问题,将复杂的分布式计算任务拆解为两个核心阶段,降低大数据开发的门槛。

2. 核心思想

MapReduce 的核心思想是 「分而治之,先分后合」:
分 (Map):把一个超大的计算任务、一份海量的数据集,拆分成多个相互独立、可并行执行的小任务和小数据集,每个小任务只处理对应分片的数据;
合 (Reduce):将所有小任务处理后的零散结果,按照指定规则进行汇总、聚合、计算,最终得到完整的业务结果。

3. 核心特点

分布式并行执行:天然支持多节点并行处理任务,充分利用集群算力,大幅提升数据处理效率;
高容错性:集群中某个节点故障时,框架自动将该节点的任务调度至其他节点重试,不影响最终结果;
开发简洁:开发人员只需编写核心业务逻辑,无需关注底层的任务调度、数据传输、故障恢复等复杂细节;
高扩展性:数据量增大时,无需修改代码,仅需增加集群节点即可支撑更大规模的数据处理。

4. 适用场景

MapReduce 适用于离线批量数据处理,典型场景包含:数据统计(求和、求平均、计数)、日志分析、数据清洗与去重、词频统计、分布式排序等。

二、MapReduce 完整实现过程

MapReduce 的执行流程是固定且不可逆的,完整分为四大核心阶段,执行顺序为:Map阶段 → Shuffle阶段 → Reduce阶段,全程由Driver 驱动类统一调度配置,四个阶段缺一不可,共同完成整个计算任务。
重要说明:开发人员仅需要编写 Map、Reduce、Driver 三类代码,Shuffle 阶段由 MapReduce 框架自动完成,无任何手动编码。

(一)Map 阶段

1. 阶段作用

Map 阶段是 MapReduce 的数据处理与转换阶段,是「分」的核心体现。核心功能是:读取分片后的原始数据,按照业务需求对数据做过滤、提取、转换,最终输出指定格式的键值对(Key-Value),为后续聚合做准备。

2. 执行核心规则

Map 任务的输入是固定格式的键值对:Key=LongWritable(当前行数据在文件中的字节偏移量,无业务意义)、Value=Text(当前行的完整文本内容);
开发需自定义类继承框架的Mapper父类,并重写核心的map()方法,所有业务逻辑均在该方法中实现;
map()方法是逐行执行的:框架读取到的每一行数据,都会调用一次map()方法进行处理;
Map 阶段的多个任务之间相互独立、无依赖、并行执行,不同 Map 任务处理不同的数据分片。

(二)Shuffle 阶段(核心核心,框架自动执行)

1. 阶段作用

Shuffle 译为「洗牌」,是连接 Map 阶段和 Reduce 阶段的唯一桥梁,也是 MapReduce 的核心核心。核心功能是:对 Map 阶段输出的所有零散键值对做数据整理,最终将相同 Key 的所有 Value 值聚合为一个集合,传递给对应的 Reduce 任务。

2. 执行核心规则

全程由 MapReduce 框架自动实现,无任何手动编码,开发人员只能通过参数调优提升性能,无法修改执行逻辑;
执行流程分为「Map 端处理」和「Reduce 端处理」:
Map 端:对 Map 输出的键值对做 分区、排序、溢写、合并,最终将整理后的数据写入节点本地磁盘;
Reduce 端:主动拉取对应分区的数据,对数据做 合并、排序、分组,最终形成 一个Key对应一个Value集合 的格式,作为 Reduce 阶段的输入。
核心保障:相同的 Key 一定会被分发到同一个 Reduce 任务中进行处理,为后续的聚合计算提供数据基础。

(三)Reduce 阶段

1. 阶段作用

Reduce 阶段是 MapReduce 的数据聚合与结果计算阶段,是「合」的核心体现。核心功能是:接收 Shuffle 阶段整理后的结构化数据,按照业务需求对同 Key 的 Value 集合做聚合计算(求和、求平均、计数等),最终输出满足业务需求的最终结果。

2. 执行核心规则

Reduce 任务的输入是固定格式:Key=业务自定义Key、Value=Iterable<业务自定义Value>,即一个 Key 对应多个 Value 的可迭代集合;
开发需自定义类继承框架的Reducer父类,并重写核心的reduce()方法,所有聚合计算的业务逻辑均在该方法中实现;
reduce()方法是按 Key 执行的:框架将同一个 Key 的所有 Value 集合,一次性传入reduce()方法中处理;
Reduce 任务需要 等待所有 Map 任务执行完成后才能启动,因为需要拉取所有 Map 节点的输出数据。

(四)Driver 驱动阶段

1. 阶段作用

Driver 是 MapReduce 作业的入口程序,也叫驱动类,本质是一个带main方法的 Java 类,是整个 MapReduce 任务的「总指挥」。没有 Driver 类,Map 和 Reduce 任务都无法执行。

2. 执行核心规则

Driver 阶段不参与任何数据处理,核心作用是:对整个 MapReduce 作业做全局配置、指定核心组件、设置数据的输入输出路径,最终将作业提交到集群执行,并监控作业的运行状态;
所有配置项均为固定的 API 调用,是 MapReduce 作业运行的必要条件,缺一不可;
作业执行完成后,根据执行结果返回状态码,成功返回 0,失败返回 1。

三、MapReduce 案例分析:学生各科目平均分统计

(一)案例需求

1. 业务需求

输入为 CSV 格式的学生成绩数据,每行数据格式为 学号,科目,分数,要求通过 MapReduce 分布式计算,统计出每一个科目的平均分,最终输出格式为 科目 平均分。

2.数据样例

某中学一次月考后,有一份某年级学生的成绩表,现要求统计本次月考各科目平均成绩,其中部分内容和平均成绩如下所示:

3. 核心实现思路

Map 阶段:读取每行成绩数据,按逗号拆分字段,提取科目作为输出 Key,提取分数作为输出 Value,输出键值对 (科目,分数);
Shuffle 阶段:框架自动将同科目的所有分数聚合为一个集合,形成 (科目, [分数1,分数2,分数3...]);
Reduce 阶段:接收同科目的分数集合,累加计算总分、统计人数,最终计算出该科目的平均分,输出键值对 (科目,平均分)。

(二)完整代码实现 + 逐行详细分析

代码一:Map 阶段 - 自定义 Mapper 类 wxy20246030844Mapper.java

package com.hadoop.zuoye; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; public class wxy20246030844Mapper extends Mapper<LongWritable, Text, Text, IntWritable> { private Text outkey = new Text(); private IntWritable outvalue = new IntWritable(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 将Hadoop的Text类型转换为Java的String类型,方便后续字符串处理 String lineData = value.toString(); String[] splitData = lineData.split(","); // 给输出的Key赋值 → 将拆分后的科目名称赋值给outkey outkey.set(splitData[1]); // 给输出的Value赋值 → 将拆分后的分数转成int类型,再赋值给outvalue int score = Integer.parseInt(splitData[2]); outvalue.set(score); // 核心API - 输出键值对,将(科目,分数)写入框架,进入后续的Shuffle阶段 context.write(outkey, outvalue); } }

代码核心总结:Map 阶段的核心是「数据提取与转换」,把原始的一行成绩数据,转换成后续能聚合的键值对格式,无任何计算逻辑。
代码二:Reduce 阶段 - 自定义 Reducer 类 wxy20246030844Reducer.java

package com.hadoop.zuoye; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; public class wxy20246030844Reducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable valueout = new IntWritable(); @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; int count = 0; for (IntWritable val : values) { sum += val.get(); count++; } int avg_grade = sum / count; valueout.set(avg_grade); context.write(key, valueout); } }

代码核心总结:Reduce 阶段的核心是「数据聚合与计算」,对同科目下的所有分数做统计计算,得到最终业务结果,是整个需求的核心计算环节。
代码三:Driver 驱动阶段 - 驱动类 wxy20246030844Driver.java

package com.hadoop.zuoye; 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.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import java.io.IOException; public class wxy20246030844Driver { public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException { Configuration conf = new Configuration(); Job job = Job.getInstance(conf); job.setJarByClass(wxy20246030844Driver.class); job.setMapperClass(wxy20246030844Mapper.class); job.setReducerClass(wxy20246030844Reducer.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.setInputPaths(job, new Path("D:\\wven\\input")); FileOutputFormat.setOutputPath(job, new Path("D:\\wven\\output")); boolean result = job.waitForCompletion(true); System.exit(result ? 0 : 1); } }

代码核心总结:Driver 类是整个作业的「总指挥」,所有配置都是 MapReduce 的固定规范,配置项缺一不可,核心作用就是把 Map、Reduce 串联起来,形成完整的作业并执行。

(三)案例执行结果

1. 执行方式

直接运行 wxy20246030844Driver 类的main方法,MapReduce 框架会自动调度执行 Map 任务、Shuffle 阶段、Reduce 任务。

2. 结果文件位置

作业执行成功后,在配置的输出路径 D:\wven\output 目录下,生成核心结果文件 part-r-00000。

3. 最终结果内容

4. 结果说明

文件中每行数据格式为科目 平均分,准确统计出每个科目的平均分,完全符合业务需求,整个 MapReduce 作业执行完成。


四、整体总结

  1. MapReduce 的核心是「分而治之」,通过Map拆分处理Reduce聚合计算完成海量数据处理,Shuffle 是连接两者的核心桥梁;
  2. 开发核心:只需要编写三类代码,Map 类做数据转换、Reduce 类做数据计算、Driver 类做任务配置,无其他复杂编码;
  3. 执行核心:Map 阶段是「逐行处理、并行执行」,Reduce 阶段是「按 Key 聚合、汇总计算」;
  4. 本次案例是 MapReduce 最经典的统计类场景,完美体现了其设计思想,也是所有 MapReduce 开发的基础模板,所有统计类需求均可基于此模板修改实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1149947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WBS / 项目编码与项目 / 模板的关联操作(核心在 OPSA + 模板配置)

WBS / 项目编码与项目 / 模板的关联操作&#xff08;核心在 OPSA 模板配置&#xff09;WBS / 项目编码的规则&#xff08;OPSJ 的掩码&#xff09;&#xff0c;是通过项目参数文件&#xff08;OPSA&#xff09; 关联到具体项目 / 项目模板的&#xff0c;同时模板本身也需要单独…

基于DP_MPC算法的氢能源动力无人机能量管理 背景:随着氢燃料的开发,氢能源被应用到许多领域...

基于DP_MPC算法的氢能源动力无人机能量管理 背景&#xff1a;随着氢燃料的开发&#xff0c;氢能源被应用到许多领域&#xff0c;但是由于其不能储能&#xff0c;所以通常与储能元件搭配使用&#xff0c;复合电源就涉及到能源分配问题&#xff0c;于是需要一个合适的能量管理算法…

电商抠图效率翻倍|使用CV-UNet大模型镜像实现自动化处理

电商抠图效率翻倍&#xff5c;使用CV-UNet大模型镜像实现自动化处理 TOC 1. 引言&#xff1a;电商图像处理的痛点与破局之道 在电商平台运营中&#xff0c;商品图片的质量直接影响转化率。传统的人工抠图方式不仅耗时耗力&#xff0c;还难以保证边缘细节的一致性&#xff0c;…

从零部署AutoGLM-Phone-9B|移动端90亿参数模型运行全步骤

从零部署AutoGLM-Phone-9B&#xff5c;移动端90亿参数模型运行全步骤 1. AutoGLM-Phone-9B 模型简介与部署价值 1.1 多模态轻量化大模型的技术定位 AutoGLM-Phone-9B 是基于智谱AI GLM架构深度优化的移动端专用多模态大语言模型&#xff0c;在保持90亿参数规模的同时&#x…

导师不会说的9款AI论文神器,巨鲸写作半天搞定全文!

开头&#xff1a;90%的学生不知道的论文“黑科技”&#xff0c;导师私藏的毕业捷径 你是否经历过这些绝望时刻&#xff1f; 熬夜一周写的初稿&#xff0c;被导师用红笔批满“逻辑混乱”“缺乏创新”&#xff0c;却不告诉你具体怎么改&#xff1b;为了降重&#xff0c;把“研究…

C# XML文件读取软件:支持自由定位与蛇形走位,主要应用于晶圆图谱识别

C#编写的一款读取xml文件的mapping图软件。 可以自由定位位置&#xff0c;统计数量&#xff0c;蛇形走位。 主要用在晶圆图谱识别。 基于对原始代码的深入分析&#xff0c;这是一套完整的晶圆测试Mapping图可视化与分析系统&#xff0c;主要用于半导体制造过程中的晶圆测试数据…

NPP 草原:Taullgarnsnaset,瑞典,1968-1969,R1

NPP Grassland: Tullgarnsnaset, Sweden, 1968-1969, R1 简介 该数据集包含三个 ACSII 文件&#xff08;.txt 格式&#xff09;。其中两个文件包含位于瑞典斯德哥尔摩附近 Tullgarnsnaset&#xff08;约北纬 59.20&#xff0c;东经 17.50&#xff09;的两个未放牧海滨草甸样地…

matlab仿真程序,二阶MASs,事件触发机制 这段代码是一个带有领导者的二阶多智能体的领导...

matlab仿真程序&#xff0c;二阶MASs&#xff0c;事件触发机制这段代码是一个带有领导者的二阶多智能体的领导跟随一致性仿真。以下是对代码的分析&#xff1a;1. 代码初始化了系统参数&#xff0c;包括邻接矩阵A、拉普拉斯矩阵L、系统的领导跟随矩阵H等。 2. 代码定义了一个二…

如何高效做中文情绪识别?试试这款轻量级CPU友好型大模型镜像

如何高效做中文情绪识别&#xff1f;试试这款轻量级CPU友好型大模型镜像 1. 引言&#xff1a;中文情感分析的现实挑战与新思路 在社交媒体监控、用户评论挖掘、舆情分析等实际业务场景中&#xff0c;中文情感分析已成为自然语言处理&#xff08;NLP&#xff09;的核心任务之一…

高精度中文文本匹配方案|基于GTE模型的WebUI与API双支持

高精度中文文本匹配方案&#xff5c;基于GTE模型的WebUI与API双支持 1. 项目背景与技术选型 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;语义相似度计算是搜索、推荐、问答系统和大模型增强检索&#xff08;RAG&#xff09;等任务的核心基础。传统关键词匹配…

2026最新CTF知识点网址汇总大全,零基础入门到精通,收藏这篇就够了

2026最新CTF知识点网址汇总大全&#xff0c;零基础入门到精通&#xff0c;收藏这篇就够了 全网最全CTF资源导航站&#x1f525;从入门到进阶&#xff0c;看这篇就够了 经常会有粉丝朋友后台私信评论留言想要CTF相关资料&#xff0c;大白也深知大家想在CTF大赛中叱咤风云却苦于…

高效中文情绪识别方案|CPU版大模型镜像一键启动

高效中文情绪识别方案&#xff5c;CPU版大模型镜像一键启动 1. 背景与需求&#xff1a;轻量级中文情感分析的工程挑战 在实际业务场景中&#xff0c;中文情感分析广泛应用于用户评论挖掘、客服质检、舆情监控等领域。尽管大模型在精度上表现优异&#xff0c;但多数依赖GPU部署…

在 SAP 系统中,寄售业务(Consignment) 和管道业务(Pipeline) 均属于供应商库存管理(Vendor-Managed Inventory, VMI) 范畴

在 SAP 系统中&#xff0c;寄售业务&#xff08;Consignment&#xff09; 和管道业务&#xff08;Pipeline&#xff09; 均属于供应商库存管理&#xff08;Vendor-Managed Inventory, VMI&#xff09; 范畴&#xff0c;核心是物料所有权在消耗前归供应商&#xff0c;消耗后才与…

中文情感分析实战|基于StructBERT大模型镜像快速部署

中文情感分析实战&#xff5c;基于StructBERT大模型镜像快速部署 1. 引言&#xff1a;为什么需要轻量高效的中文情感分析方案&#xff1f; 在当前自然语言处理&#xff08;NLP&#xff09;广泛应用的背景下&#xff0c;中文情感分析已成为智能客服、舆情监控、用户评论挖掘等…

语义相似度服务零报错部署|基于GTE-Base模型的WebUI可视化方案

语义相似度服务零报错部署&#xff5c;基于GTE-Base模型的WebUI可视化方案 在自然语言处理的实际应用中&#xff0c;判断两段文本是否“意思相近”是一项高频且关键的需求。无论是智能客服中的意图匹配、推荐系统中的内容去重&#xff0c;还是知识库问答的相似问题检索&#x…

2026年安徽省职业院校技能大赛(中职组) 电子数据取证技术与应用赛项规程

2024学年云南省职业院校技能大赛 “信息安全管理与评估”赛项 比赛样题任务书一、赛项名称二、竞赛目标三、竞赛方式与内容汇报模块&#xff1a;现场汇报展示&#xff08;占比 20%&#xff09;四、竞赛流程竞赛软件&#xff1a;五、赛场预案六、赛项安全七、竞赛须知八、申诉与…

sap中 为什么 rz11 修改了 rdisp/gui_auto_logout 当次有用,当sap服务器重新启动后 系统又该回原值了?

这种情况是完全正常的&#xff0c;其根本原因在于 RZ11 修改的是实例的运行时内存参数&#xff0c;而不是永久配置参数。下面为您详细解释一下原因和正确的做法&#xff1a;1. 原因分析&#xff1a;运行时参数 vs. 实例配置文件RZ11 的作用&#xff1a;RZ11 是一个用于 动态检查…

高精度中文语义计算方案|GTE模型镜像实现低延迟相似度推理

高精度中文语义计算方案&#xff5c;GTE模型镜像实现低延迟相似度推理 1. 引言&#xff1a;中文语义理解的现实挑战与GTE的破局之道 在智能客服、内容推荐、知识检索等实际业务场景中&#xff0c;如何准确判断两段中文文本的语义是否相近&#xff0c;一直是自然语言处理的核心…

如何精准提取PDF公式与表格?试试科哥开发的PDF-Extract-Kit镜像

如何精准提取PDF公式与表格&#xff1f;试试科哥开发的PDF-Extract-Kit镜像 1. 引言&#xff1a;PDF智能提取的痛点与解决方案 在科研、教育和工程领域&#xff0c;PDF文档中往往包含大量关键信息——数学公式、数据表格和专业图表。然而&#xff0c;传统方式从PDF中提取这些…

无需GPU!用StructBERT中文情感分析镜像实现高效情绪识别

无需GPU&#xff01;用StructBERT中文情感分析镜像实现高效情绪识别 1. 背景与痛点&#xff1a;传统情感分析的局限性 在自然语言处理&#xff08;NLP&#xff09;的实际应用中&#xff0c;情感分析&#xff08;Sentiment Analysis&#xff09;是一项高频需求。无论是电商平台…