2020-7-26
一. Partition分区:
功能:
按照条件将结果输入到不同的文件中
实现步骤:
自定义排序规则继承Partitioner类,重写getPartition()方法
在job驱动Driver中设置自定义排序规则
在Driver中根据分区数,设置ReduceTask数
分区数和ReduceTask关系
如果ReduceTask的数量(分区数)大于getPartition设置的数量,会产生空的输出文件
如果ReduceTask的数量大于1,getPartition又大于ReduceTask的数量,就会出现无处安放的数据,会抛出异常
如果ReduceTask的数量等于1,不管你设置了多少个分区,最后输出都会输出到一个文件里part-r-00000000
分区号必须是从0开始。例如:设置4个分区,则输出文件为编号为0,1,2,3。getPartition里面的分区指定也要符合这个规则
二. Group分组:
功能
发生在Reduce之前,增加reduce的并行度
实现步骤:
写一个分组类,继承WritableComparator类
重写构造方法
重写compare(WritableComparable a,
WritableComparable b)方法
Driver指定分组器setGroupingComparatorClass
意义:
合理使用,按照特定规则进行归纳,增加reduce
任务并行度,防止Reduce端数据倾斜
三. Compare排序:
功能:
MapReduce的排序主要是指的将Map输出的key进行排序
但是整个Shuffle中会用到四次排序,都会按照指定的排序规则排序
实现步骤
MapReduce提供的数据类型均已实现WritableComparable接口。
直接在对象中实现WritableComparable接口,重写write(),readFields(),compareTo(),三个方法。在compareTo方法里定义排序规则。
写一个排序比较器,继承WritableComparable,重写构造方法和compare方法。
在Driver中设置排序比较器器。
setSortComparatorClass(class);
注意
MapTask和ReduceTask均会对数据按照Key进行排序,该操作属于MR默认行为。
任何应用程序中的数据均会被排序,不论是否需要。MapTask输出的key必须实现writablecomparable接口,实现compareTo方法。即使指定排序规则,若key对象没有comperTo方法仍会抛出异常(指定的规则最终仍会调用key的compareTo)。所以MapTask输出的key无论如何必须实现WC接口