分区
默认分区是根据key的hashCode对reduceTasks个数取模得到的.用户没法控制那个key存储到那个分区
自定义分区需要
- 自己写个类继承抽象类Partitioner,这个类就是定义分区规则的
- 在job驱动中,设置自定义partitioner
- 设置reduce个数
写法
Mapreduce中会将map输出的k-v对,按照相同key分组,然后分发给不同的reducetask
默认的分发规则为:根据key的hashcode%reducetask
数来分发
所以:如果要按照我们自己的需求进行分组,则需要改写数据分发(分组)组件Partitioner
数据倾斜问题:
单纯某个key的数据量大,可在key之后增加随机数,把相应的key打散
自定义一个CustomPartitioner继承抽象类:Partitioner
然后在job对象中,设置自定义partitioner: job.setPartitionerClass(CustomPartitioner.class)
我们需要继承Partitioner这个分区类,来实现我们自己的分区