目录
一:MapReduce定义
- 简介
Mapreduce 是一个分布式运算程序的编程框架,是用户开发“基于 hadoop 的数据分析应用”的核心框架。
Mapreduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个 hadoop 集群上。 - Mapreduce 优缺点
⑴优点:
a:MapReduce 易于编程
它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的 PC 机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模
一样的。就是因为这个特点使得 MapReduce 编程变得非常流行。
b:良好的 扩展性
当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。
c: 高容错性
MapReduce 设计的初衷就是使程序能够部署在廉价的 PC 机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由Hadoop 内部完成的。
d:适合 PB 级以上海量数据的 离线处理
这里加红字体离线处理,说明它适合离线处理而不适合在线处理。比如像毫秒级别的返回一个结果,MapReduce 很难做到。
⑵缺点:
a:MapReduce 不 擅长做实时计算、流式计算、DAG(有向图 ) 计算
b:实时计算:
MapReduce 无法像 Mysql 一样,在毫秒或者秒级内返回结果。
c:流式计算:
流式计算的输入数据是动态的,而 MapReduce 的输入数据集是静态的,不能动态变化。这是因为 MapReduce 自身的设计特点决定了数据源必须是静态的。
d:DAG (有向图)计算:
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce 并不是不能做,而是使用后,每个 MapReduce 作业的输出结果都会写入到磁盘,会造成大量的磁盘 IO,导致性能非常的低下。 - MapReduce的核心思想

二:MapReduce进程
- 简介
三:MapReduce 编程规范 (八股文)
- 简介
用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行 mr 程序的客户端)。 - Mapper阶段

- Reducer阶段

- Driver 阶段
整个程序需要一个 Drvier 来进行提交,提交的是一个描述了各种必要信息的 job 对象
四:WordCount 案例
- 需求:
在一堆给定的文本文件中统计输出每一个单词出现的总次数。 - 数据准备,一个文件hello.txt,内容如下

- 案例分析

- 代码实现
⑴在idea中创建工程

⑵创建自定义的Mapper类去对数据进行分类,注意:我们这里会将所有数据分类完成后才会进入到下一阶段
package com.kgf.mapreduce; import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; /*** * * 继承的Mapper参数如下: *第一个参数key:LongWritable表示输入的key的行号 *第二个参数value:Text表示一行内容 *第三个参数key: Text表示单词 *第四个参数value:IntWritable表示计算后的单词的个数 * @author kgf * */ public class WordCountMapper extends Mapper<LongWritable,Text,Text,IntWritable>{ Text k = new Text(); IntWritable v = new IntWritable(1); /** * 使用map方法去处理数据,数据是一行一行进入到这个方法处理的 * key:表示行号 * value:表示一行数据内容 */ @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //首先我们将一行内容转换成String String line = value.toString(); //数据的单词之间是以空格切割的 String[] words = line.split(" "); //将数据循环写出到下一阶段 for (String word : words) { k.set(word); context.write(k, v); } } }⑶创建自定义的Reducer类对分类的数据进行汇总
package com.kgf.mapreduce; import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; /** * 注意:这里继承Reducer的前两个入参就是Mappper的出参数 * @author kgf * */ public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{ /** * 这个方法主要是对map分类之后的数据进行聚合的 */ @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { //统计单词个数 int sum = 0; for (IntWritable count : values) { sum+=count.get(); } //输出单词总个数 context.write(key, new IntWritable(sum)); } }⑷创建Driver提交任务
package com.kgf.mapreduce; import java.io.IOException; 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.FileOutputCommitter; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCountDriver { public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { //1:首先获取job信息 Configuration conf = new Configuration(); Job job = Job.getInstance(conf); //2:获取jar包位置,指定入口类,hadoop会自己找到 job.setJarByClass(WordCountDriver.class); //3:关联自定义的mapper和reducer job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); //4:设置map输出类型 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); //5:设置reducer输出类型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); //6:设置数据输入和输出文件路径,这里我们通过main方法获取参数路径 FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); //7:提交代码 boolean result = job.waitForCompletion(true); System.exit(result?0:1); } } - 在idea上将程序打成jar包

- 对jar包进行测试
⑴启动集群
⑵将jar包以及准备的hello.txt数据文本上传到/opt/module/hadoop-3.1.3/目录下,并且设置有权限
⑶将准备的hello.txt文件上传的hdfs指定目录下


⑷使用我们的jar去测试(当前路径:/opt/module/hadoop-3.1.3):
命令:hadoop jar +jar名称 +Driver入口的全路径 +输入路径 +输出路径

执行成功生成的文件:

⑸查看文件内容

- 本地模式运行
⑴上面我们是将jar包放到集群上运行,这里我们们需要在本地直接运行,因为本地我们有hadoop的jar包
⑵在eclise上配置环境变量

注意:输出路径不能提前建好。

⑶执行效果:

本文深入解析MapReduce框架,介绍其编程模型、优势及局限,并通过WordCount案例演示如何在Hadoop集群上实现分布式数据处理。
2万+

被折叠的 条评论
为什么被折叠?



