吕梁市网站建设_网站建设公司_自助建站_seo优化
2026/1/12 19:47:23 网站建设 项目流程

一、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 开发的基础模板,所有统计类需求均可基于此模板修改实现。

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

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

立即咨询