MapReduce:


1.是一个分布式的计算模型,用于解决海量数据的计算问题。

2.由两部分组成,Map和Reduce

3.Map和Reduce的参数都是key,value的形式



MapReduce的执行过程:

1.Map任务处理:

   1.1读取HDFS中的文件作为输入,解析为key,value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。(k1,v1);

   1.2在复写的map函数中,编写处理逻辑,对输入的key、valu对进行处理,转换成新的key、value(k2,v2);

   1.3对输出的结果进行分区(key相同的放在一块);

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

   1.5分组后的数据进行规约。----把大的数据变为小的数据(可选步骤)(k2,v2)

2.Reduce任务处理:

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

   2.2对多个map任务的输出进行合并,排序。写reduce函数实现自己的逻辑,对输入的k2,v2进行处理,转换成新的key,value(k3,v3)

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


-----------------------------规约:

job.setCombinerClass(MyReduce.class);//形参是自定义一的reduce类

1.为什么使用combiner:

   Combiner发生在map端,对数据进行规约处理,数据量变小,网络传输变少,传输到reduce的数据量变小,传输时间变短,作业的整体时间变短。


2.为什么Combiner不作为mapreduce的标配

   因为不是所有的算法都适合使用Combiner处理,如求平均数


3.Combiner本身已经执行了reduce操作,为什么在Reducer阶段还是要执行reduce操作

   Combiner发生在map端,处理一个任务所接收的文件中的数据,不能跨map执行,只有reduce可以接收多个map任务处理的数据