千家信息网

MapReduce执行原理是什么

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要介绍"MapReduce执行原理是什么",在日常操作中,相信很多人在MapReduce执行原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"MapRe
千家信息网最后更新 2025年02月01日MapReduce执行原理是什么

这篇文章主要介绍"MapReduce执行原理是什么",在日常操作中,相信很多人在MapReduce执行原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"MapReduce执行原理是什么"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

MapReduce概述

◆MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.

◆MR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算,非常简单。

◆这两个函数的形参是key、value对,表示函数的输入信息。

MR执行流程

MapReduce执行原理

◆执行步骤:

1. map任务处理

1.1 读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。

1.2 写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。

1.3 对输出的key、value进行分区。

1.4 对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。

1.5 (可选)分组后的数据进行归约。

2.reduce任务处理

2.1 对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。

2.2 对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。

2.3 把reduce的输出保存到文件中。


对文本文件hello 文本内容如下 文件进行Mapreduce

hello you
hello me

代码实现如下

package MapReduce;import java.net.URI;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.Mapper;import org.apache.hadoop.mapreduce.Reducer;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WordCountApp {        static final String INPUT_PATH = "hdfs://hadoop:9000/hello";        static final String OUT_PATH = "hdfs://hadoop:9000/out";                public static void main(String[] args) throws Exception {                Configuration conf = new Configuration();                final FileSystem fileSystem = FileSystem.get(new URI(INPUT_PATH), conf);                final Path outPath = new Path(OUT_PATH);                if(fileSystem.exists(outPath)){                        fileSystem.delete(outPath, true);                }                                final Job job = new Job(conf , WordCountApp.class.getSimpleName());                //1.1指定读取的文件位于哪里                FileInputFormat.setInputPaths(job, INPUT_PATH);                //指定如何对输入文件进行格式化,把输入文件每一行解析成键值对                //job.setInputFormatClass(TextInputFormat.class);                                //1.2 指定自定义的map类                job.setMapperClass(MyMapper.class);                //map输出的类型。如果的类型与类型一致,则可以省略                //job.setMapOutputKeyClass(Text.class);                //job.setMapOutputValueClass(LongWritable.class);                                //1.3 分区                //job.setPartitionerClass(HashPartitioner.class);                //有一个reduce任务运行                //job.setNumReduceTasks(1);                                //1.4 TODO 排序、分组                                //1.5 TODO 规约                                //2.2 指定自定义reduce类                job.setReducerClass(MyReducer.class);                //指定reduce的输出类型                job.setOutputKeyClass(Text.class);                job.setOutputValueClass(LongWritable.class);                                //2.3 指定写出到哪里                FileOutputFormat.setOutputPath(job, outPath);                //指定输出文件的格式化类                //job.setOutputFormatClass(TextOutputFormat.class);                                //把job提交给JobTracker运行                job.waitForCompletion(true);        }                /**         * KEYIN      即k1             表示行的偏移量         * VALUEIN    即v1             表示行文本内容         * KEYOUT     即k2             表示行中出现的单词         * VALUEOUT   即v2             表示行中出现的单词的次数,固定值1         */        static class MyMapper extends Mapper{                protected void map(LongWritable k1, Text v1, Context context) throws java.io.IOException ,InterruptedException {                        final String[] splited = v1.toString().split(" ");                        for (String word : splited) {                                context.write(new Text(word), new LongWritable(1));                        }                };        }                /**         * KEYIN      即k2             表示行中出现的单词         * VALUEIN    即v2             表示行中出现的单词的次数         * KEYOUT     即k3             表示文本中出现的不同单词         * VALUEOUT   即v3             表示文本中出现的不同单词的总次数         *         */        static class MyReducer extends Reducer{                protected void reduce(Text k2, java.lang.Iterable v2s, Context ctx) throws java.io.IOException ,InterruptedException {                        long times = 0L;                        for (LongWritable count : v2s) {                                times += count.get();                        }                        ctx.write(k2, new LongWritable(times));                };        }                }

运行上面程序,编辑hello文件上传至HDFS文件系统中

到此,关于"MapReduce执行原理是什么"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0