1.MapReduce思想
1、MapReduce会将一个大的计算任务进行拆分,拆分成小任务,让这些小任务在不同的计算机中进行处理,最后再将这些小任务的结果记性整体汇总
2、MapReduce分为两个阶段,一个Map阶段负责任务的拆分,一个是Reduce阶段,负责任务的汇总
3、整个MapReduce工作流程可以分为3个阶段:map、shuffle、reduce。
2.MapReduce的shuffle阶段
2.1 分区
1、分区就是分文件,本质是将不同的键值对,最后输出的不同的文件中,理解为将数据进行拆分
2、实现的方式是;在Map阶段对k2打标记,标记相同的数据就会分到同一个分区,同一个分区的数据会被同一个redue拉取
if(id % 2 == 0){
return 0;
}else{
return 1;
}
3、如果设置了分区则会有多个文件输出,则需要有多个reduce,相同标记的K2数据会被同一个reduce
处理,多个reduce就会产生多个结果文件
4、partition原来就是map结束之后根据key值不同,自定义打个标签。然后再由不同的reducer拉一下。
2.2 排序
概述:
1、MapReduce中只能根据K2进行排序
2、如果想按照某个字段排序,则应该把这个字段包含在K2中
注意要点:
1、如果在MR中自定义Java类,则MR对该类有以下要求
1) 要求该类必须能够被序列号 : 实现接口 Writable
2) 如果该类作为K2,则要求该类必须指定排序规则,被排序: 实现WritableComparable接口
2、Writable和WritableComparable关系
public interface WritableComparable<T> extends Writable, Comparable<T> {}
2.3 规约
1、规约(Combiner)是MapReduce中的优化手段,将每一个Map的数据进行提前的聚合,减少Map端和Reduce端网络传输的数据量
2、规约可以理解为Reduce的逻辑在每一个Map端先执行一遍
3、Reduce是对所有的Map的数据进行汇总,而规约是对每一个Map的结果进行汇总
4、Combiner只是一种优化手段,不能改变最终的执行结果
2.4 分组
1、分组的作用就是去K2进行去重,然后相同K2的V2存入集合
hello 1
hello 1 -----分组--------> hello [1,1,1] ----reduceTask----> hello 3
hello 1
2、MR默认的分组是根据K2来决定的,相同K2的数据会被分到同一组
3、当默认的分组,不满足我们的需求时,我们可以使用自定义分组
4、当我们没有指定分组规则时,系统默认调用K2类中的compareTo方法,如果我们自定义了分组规则,则就按照我们的方式来实现分组