概述:Map方法之后,Reduce方法之前的数据处理过程被称为Shuffle。
Shuffle过程:
1.Partition 分区
2.Sort 分组
MapSort
GroupSort
3.Combiner Map合并
过程图解:
Shuffle是MR处理流程中的一个过程,步骤分散在map和reduce节点上。整体上分为三个操作:
1.分区partition为map Task阶段。
2.sort根据key Task排序,为reduce阶段。
3.最后Combiner进行局部value的合并。
Partition分区:
1.默认Partitioner分区:
public class HashPartitioner<K,V> extends Partitioner<K,V>{
public int getParttion(K key,V value, int numReduceTasks){
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
默认分区是根据key的hashCode对Reduce Tasks个数取模得到的。用户不能控制key存放在指定分区。
2.自定义Partitioner步骤
1)自定义继承Partitioner,重写getPartition()方法
public class CustomPartitioner extends Partitioner<Text, FlowBean>{
@Override
public int getPartition(Text key, FlowBean value, int numpartitions){
//控制分区代码
~~~
return partition;
}
}
2)在Job驱动中,设置自定义Paririoner
job.setPartitionerClass(CustomPartitioner.class);
c.自定义Partition后,要根据自定义Partition的逻辑设置相应数量的Reduce Task
job.setNumReduceTasjs(3);
3.分区总结
1)如果ReduceTask的数量大于getPartition的结果数,则会产生几个空的输出文件。
2)如果1getPartition的结果数大于ReduceTask的数量大于1,则有一部分分区数据无处安放,会报错。
3)如果ReduceTask的数量等于一,则不管MapTask端输出多少个分区文件,最终结果都会交给这一个ReduceTask,最终也就只会只产生一个结果文件。
4)分区号必须从零开始,逐一累加。