一、Shuffle机制

Map方法之后,Reduce之前的数据处理过程称之为Shuffle。
包括Map阶段的Collect、溢写、Combine阶段和Reduce的Copy、Merge、Sort阶段

二、Partition分区

Map阶段之后,app master会根据job设定的分区数分配Reduce任务,分区数=Reduce数。不同的Reduce任务将输出不同的结果文件。

1.Hash Partition

Hash Partition是默认的分区方式。

  1. public class HashPartitioner<K, V> extends Partitioner<K, V> {
  2. public HashPartitioner() {
  3. }
  4. public int getPartition(K key, V value, int numReduceTasks) {
  5. return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
  6. }
  7. }

根据Key的hashcode对设定的分区数进行取余操作,得到最终分区。只要在Job驱动中设置分区数量就会自动使用这种方式进行分区。

2.自定义分区方式

  1. 自定义一个类继承Partitioner,重写getPartition()方法
  2. 在Job驱动中,设置自定义Partitioner
  3. 在Job驱动中,根据分区逻辑设置正确的分区数量(ReduceTask数量)

    三、排序

    1.默认排序

    mapreduce会自动对key进行字典排序,排序的实现方式是快排

    2.排序分类

    (1)部分排序
    保证每个输出文件内有序
    (2)全排序
    只输出一个文件,且这个文件内有序
    (3)辅助排序
    在Reduce端对key进行分组。应用于在接收的key为Bean对象时,根据Bean对象的一个或几个字段进行分组
    (4)二次排序
    在自定义排序过程中,如果compareTo方法中的判断条件为两个即为二次排序

    3.自定义排序

  4. 实现继承WritableComparable的Bean对象,并重写compareTo方法

  5. 使用Bean对象作为传入reduce阶段的key

    4.GroupingComparator分组(辅助排序)

  6. 自定义类继承WritableComparator

  7. 重写compare()方法

四、Combiner

1.什么是Combiner?

  1. Combiner是MR程序中Mapper和Reducer之外的一种组件
  2. Combiner组件的父类就是Reducer
  3. Combiner在每个MapTask的节点运行,仅接收这一个Mapper的数据,而Reducer接收全局所有Mapper的数据
  4. Combiner的目的是对MapTask进行局部汇总,以减小网络传输量
  5. Combiner的前提是不能影响最终的业务逻辑

    2.如何实现

  6. 实现Combiner继承Reducer,并在驱动类中指定这个Combiner

  7. 直接将Reducer作为Combiner,并在驱动类中指定这个Combiner