1、mapreduce的定义
-
MapReduce基于用户开发的分布式操作程序的编程框架Hadoop核心框架的数据分析应用。
-
MapReduce核心功能是将用户编写的业务逻辑代码和自己的默认组件集成到一个完整的分布式操作程序中,并在一个Hadoop集群上
2、MapReduce编程模型
-
MapReduce分布式计算框架采用分而治之的思想设计
-
什么是分而治之?
-
例如,一项复杂、计算量大、耗时长的任务时称为大任务;
-
此时,当单个服务器不能在短时间内计算结果时,大任务可以分为小任务,小任务可以在不同的服务器上并行执行;
-
最后,总结每个小任务的结果
-
-
MapReduce由两个阶段组成:
-
Map阶段(分成小任务)
-
Reduce阶段(总结小任务结果)
-
1. Map阶段
-
map阶段有一个关键map()函数;
-
该函数的输入是键值对
-
输出是一系列键值对,输出写入本地磁盘。
2. Reduce阶段
-
reduce有一个关键的函数阶段reduce()函数
-
该函数的输入也是键值对(即map的输出(kv对))
-
输出也是一系列键值对,结果最终写入HDFS
3、Map&Reduce
4、mapreduce编程指导思想
-
mapReduce总结编程模型:
-
MapReduce开发有八个步骤map阶段分为两个步骤,shuffle四个步骤,reduce阶段分为两个步骤
1. Map阶段2个步骤
-
第一步:设置inputFormat将数据切分为类别key,value是的,输入到第二步
-
第二步:自定义map逻辑,处理我们输入的第一步kv将数据转换为新的数据key,value对进行输出
2. shuffle阶段4个步骤
-
第三步:输出上一步key,value分区。(相同key的kv属于同一分区)
-
第四步:根据每个分区的数据key进行排序
-
第五步:规定分区中的数据(combine操作)减少数据的网络复制(可选步骤)
-
第六步:排序后kv对数据进行分组;分组的过程中,key相同的kv对为一组;同一组;kv对的所有value放入集合(每组数据调用一次)reduce方法)
3. reduce阶段2个步骤
-
第七步:多个map合并、排序、写作的任务reduce函数本身的逻辑,输入key,value处理,转化为新的key,value对进行输出
-
第八步:设置outputformat将输出的key,value将数据保存到文件中
hadoop常用的数据类型
-
hadoop没有沿用java基本的数据类型是自己包装一套数据类型,包装自己的类型和java的类型对应如下
-
对应下表中常用数据类型Hadoop数据序列化类型
Java类型 | Hadoop Writable类型 |
---|---|
Boolean | BooleanWritable |
Byte | ByteWritable |
Int | IntWritable |
Float | FloatWritable |
Long | LongWritable |
Double | DoubleWritable |
String | Text |
Map | MapWritable |
Array | ArrayWritable |
byte[] | BytesWritable |
3. 词频统计例
1、map方法,构建map逻辑
1、继承hadoop的Mapper类 Mapper<LongWritable,Text,Text,IntWritable>,后面四个是Hadoop序列化类型涉及网络传输和输入key为LongWritable,表示行数,value表示一行记录String类型,Text,IntWritable表示输出的String类型的key,IntWritable表示输出的value为Int类型。
2.重新父类setup和map方法,setup主要是初始化操作,map则自定义key和value的逻辑操作
(避免重复对象的操作)。
3、自定义Map层操作,分析一行数据,设置单词key,每个单词value设为1.便于后续统计操作。
@Override protected void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException value=hello,hello String[] words = value.toString().split(","); for (String word : words) keyOut.set(word); intWritable.set(1); context.write(keyOut,intWritable);
package wordCount;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;/** * @program: bigData01 * @ClassName WordCount * @description: * @author:蒋皓洁 * @create: 2022-06-08 10:07 * @Version 1.0 **/public class WordCountMapper extends Mapper<LongWritable,Text,Text,IntWritable> private Text keyOut; private IntWritable intWritable; /** * * * @param context * @throws IOException * @throws InterruptedException */ @Override protected void setup(Context context) throws IOException,InterruptedException keyOut = new Text();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;�