分区

默认分区是根据key的hashCode对reduceTasks个数取模得到的.用户没法控制那个key存储到那个分区

自定义分区需要

  1. 自己写个类继承抽象类Partitioner,这个类就是定义分区规则的
  2. 在job驱动中,设置自定义partitioner
  3. 设置reduce个数

写法

Mapreduce中会将map输出的k-v对,按照相同key分组,然后分发给不同的reducetask
默认的分发规则为:根据key的hashcode%reducetask数来分发
所以:如果要按照我们自己的需求进行分组,则需要改写数据分发(分组)组件Partitioner

数据倾斜问题:
单纯某个key的数据量大,可在key之后增加随机数,把相应的key打散

自定义一个CustomPartitioner继承抽象类:Partitioner
然后在job对象中,设置自定义partitioner: job.setPartitionerClass(CustomPartitioner.class)

我们需要继承Partitioner这个分区类,来实现我们自己的分区