一、Shuffle机制
Map方法之后,Reduce之前的数据处理过程称之为Shuffle。
包括Map阶段的Collect、溢写、Combine阶段和Reduce的Copy、Merge、Sort阶段
二、Partition分区
Map阶段之后,app master会根据job设定的分区数分配Reduce任务,分区数=Reduce数。不同的Reduce任务将输出不同的结果文件。
1.Hash Partition
Hash Partition是默认的分区方式。
public class HashPartitioner<K, V> extends Partitioner<K, V> {
public HashPartitioner() {
}
public int getPartition(K key, V value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
根据Key的hashcode对设定的分区数进行取余操作,得到最终分区。只要在Job驱动中设置分区数量就会自动使用这种方式进行分区。
2.自定义分区方式
- 自定义一个类继承Partitioner,重写getPartition()方法
- 在Job驱动中,设置自定义Partitioner
在Job驱动中,根据分区逻辑设置正确的分区数量(ReduceTask数量)
三、排序
1.默认排序
mapreduce会自动对key进行字典排序,排序的实现方式是快排
2.排序分类
(1)部分排序
保证每个输出文件内有序
(2)全排序
只输出一个文件,且这个文件内有序
(3)辅助排序
在Reduce端对key进行分组。应用于在接收的key为Bean对象时,根据Bean对象的一个或几个字段进行分组
(4)二次排序
在自定义排序过程中,如果compareTo方法中的判断条件为两个即为二次排序3.自定义排序
实现继承WritableComparable的Bean对象,并重写compareTo方法
-
4.GroupingComparator分组(辅助排序)
自定义类继承WritableComparator
- 重写compare()方法