Review MapReduce

计算框架

是指实现某项任务或某项工作从开始到结束的计算过程或流的结构。

MapReduce计算框架

                                   

并行计算框架

一个大的任务拆分成多个小任务,将多个小任务分发到多个节点上。每个节点同时执行计算

Hadoop为什么比传统技术方案快

1、分布式存储
2、分布式并行计算
3、节点横向扩展
4、移动程序到数据端
5、多个数据副本
 

MapReduce 核心思想

分而治之,先分后和:将一个大的、复杂的工作或任务,拆分成多个小的任务,并行处理,最终进行合并。
MapReduce由Map和Reduce组成
Map: 将数据进行拆分
Reduce:对数据进行汇总

     

WordCount计算 (在其他文章中有源码)

计算每个单词出现的次数
原始数据
zhangsan,lisi,wangwu
zhaoliu,maqi
zhangsan,zhaoliu,wangwu
lisi,wangwu
 

期望的最终
zhangsan 2
lisi 2
wangwu 3
zhaoliu 2
maqi 1


偏移量

每个字符移动到当前文档的最前面需要移动的字符个数。

hadoop数据类型

java : int long double float boolean string
hadoop : IntWritable LongWritable DoubleWritable FloatWritable BooleanWritable Text

WordCount-Map实现

1、实例一个class 继承Mapper<输入的key的数据类型,输入的value的数据类型,输出的key的数据类型,输出的
value的数据类型,>
2、重写map方法 map(LongWritable key, Text value, Context context)
key: 行首字母的偏移量
value: 一行数据
context:上下文对象
3、根据业务需求进行切分,然后逐一输出
 

WordCount-Reduce实现

1、实例一个class 继承Reducer<输入的key的数据类型,输入的value的数据类型,输出的key的数据类型,输出的
value的数据类型,>
2、重写reduce方法 reduce(Text key, Iterable values, Context context)
key: 去重后单词
values: 标记的1(好多个1,key出现几次就有几个1)
context:上下文对象
3、遍历values 进行汇总计算


WordCount-Driver实现

1、实例一个class 继承Configured 实现Tool
2、重写run方法
3、在run方法中将自己编写的map和reduce添加到集群

//1、实例一个Job
Job job=Job.getInstance(new Configuration(),"WordCount");
//2、 设置读取数据的class
job.setInputFormatClass(TextInputFormat.class);
//设置读取数据的路径
TextInputFormat.addInputPath(job,new Path("C:\\bbb.txt"));
//3、设置Map
job.setMapperClass(WordCountMap.class);
//设置map输出的类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
//4、设置reduce代码
job.setReducerClass(WordCountReduce.class);
//设置reduce输出的类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
//5、设置读输出数据的class
job.setOutputFormatClass(TextOutputFormat.class);
//设置输出数据的路径
TextOutputFormat.setOutputPath(job,new Path("C:\\ccc.txt"));
//6、等待代码执行(返回状态码)
return job.waitForCompletion(true)?0:1;

4、在main方法中调用执行。

Map的输出是 key value 的 list

reduce的输入是 key value 的 list

Shuffle(混洗)

shuffle 输入是key value的 list
shuffle 输出是key value的list
 

MapReduce计算任务的步骤

第1步:InputFormat
InputFormat 到hdfs上读取数据
将数据传给Split
第2步:Split
//设置读取数据的路径
TextInputFormat.addInputPath(job,new Path("C:\\bbb.txt"));
//3、设置Map
job.setMapperClass(WordCountMap.class);
//设置map输出的类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
//4、设置reduce代码
job.setReducerClass(WordCountReduce.class);
//设置reduce输出的类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
//5、设置读输出数据的class
job.setOutputFormatClass(TextOutputFormat.class);
//设置输出数据的路径
TextOutputFormat.setOutputPath(job,new Path("C:\\ccc.txt"));
//6、等待代码执行(返回状态码)
return job.waitForCompletion(true)?0:1;
Split将数据进行逻辑切分,
将数据传给RR
第3步:RR
RR:将传入的数据转换成一行一行的数据,输出行首字母偏移量和偏移量对应的数据
将数据传给MAP
第4步:MAP
MAP:根据业务需求实现自定义代码
将数据传给Shuffle的partition
第5步:partition
partition:按照一定的分区规则,将key value的list进行分区。
将数据传给Shuffle的Sort
第6步:Sort
Sort:对分区内的数据进行排序
将数据传给Shuffle的combiner
第7步:combiner
combiner:对数据进行局部聚合。
将数据传给Shuffle的Group
第8步:Group
Group:将相同key的key提取出来作为唯一的key,
将相同key对应的value获取出来作为value的list
将数据传给Reduce
第9步:Reduce
Reduce:根据业务需求进行最终的合并汇总。
将数据传给outputFormat
第10步:outputFormat
outputFormat:将数据写入HDFS

打包代码到集群运行

在代码中添加

job.setJarByClass(WordCountDriver.class);

打包提交
MAPREDUCE程序的输入:若是一个路径,那么程序会计算路径下的所有文件。
若是一个文件,那么只计算这个文件。
MAPREDUCE程序的输出:输出的路径必须不能存在
Map的数量不能人为设置,reduce的数量可以人为设置。
job.setNumReduceTasks(2);
reduce数量越多,计算速度越快。
combinner的添加
在map端局部聚和,设置reduce的class
job.setCombinerClass(WordCountReduce.class);

Shuffle阶段的Partition分区算法

算法:对key 进行哈希,获取到一个哈希值,用这个哈希值与reducetask的数量取余。余几,这个数据就放在余数编 号的partition中。

Split的逻辑切分

获取到读取到的数据,对数据进行逻辑切分,切分的大小是128M.
这里的128 与HDFS数据块的128没有任何关系
HDFS 128 是存储层面的数据切分
split128 是计算层面的128,只不过数据恰好相等。
两个128相同的原因是,一个集成程序能够正好计算一个数据块。
 

                             

Map的输出到内存

Map的输出先写入环形缓冲区(默认大小100M-可以认为调整)(可以再输出的同时写入数据),当缓冲区内的数据 达到阈值(默认0.8-可以人为调整)时,对数据进行flash。

flash 出去的数据的数量达到一定量(默认4个)时,进行数据的合并

 

Reduce数据读取

Reduce 主动发出拷贝进程(默认5个copy进程)到Map端获取数据。
获取到数据后,将数据写入内存,当数据达到阈值,将数据flash出去。
当flash出去文件达到一定的量时,进行数据的合并。最终将数据发送给reduce

Map到reduce内存角度宏观流程

Map到reduce处理流程角度宏观步骤

Shuffle阶段

从Map的输出到reduce的输入

流程角度

 

内存角度

发布了241 篇原创文章 · 获赞 300 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/bbvjx1314/article/details/105446524