2026/4/17 11:50:29
网站建设
项目流程
cn网站,wordpress能多人登录,wordpress用什么语言,南京专业制作网站一、MapReduce 概述1. 定义MapReduce 是一种分布式并行计算的编程模型与框架#xff0c;由 Google 提出核心思想#xff0c;Apache Hadoop 进行开源实现#xff0c;是大数据离线批量处理的核心技术。它专门解决海量数据#xff08;TB/PB 级别#xff09;的高效处理问题由 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 任务的输入是固定格式的键值对KeyLongWritable当前行数据在文件中的字节偏移量无业务意义、ValueText当前行的完整文本内容开发需自定义类继承框架的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、ValueIterable业务自定义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.javapackage 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 MapperLongWritable, 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.javapackage 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 ReducerText, IntWritable, Text, IntWritable { private IntWritable valueout new IntWritable(); Override protected void reduce(Text key, IterableIntWritable 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.javapackage 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 作业执行完成。四、整体总结MapReduce 的核心是「分而治之」通过Map拆分处理和Reduce聚合计算完成海量数据处理Shuffle 是连接两者的核心桥梁开发核心只需要编写三类代码Map 类做数据转换、Reduce 类做数据计算、Driver 类做任务配置无其他复杂编码执行核心Map 阶段是「逐行处理、并行执行」Reduce 阶段是「按 Key 聚合、汇总计算」本次案例是 MapReduce 最经典的统计类场景完美体现了其设计思想也是所有 MapReduce 开发的基础模板所有统计类需求均可基于此模板修改实现。