Mapreduce的Partition分区介绍
1. Partition分区
在前面的Mapreduce流程中提到过在shuffle过程中有分区操作,分区决定着你开启的Reduce Task数量和最终的输出文件数量,在前面的案例中,我们能看到最终的输出文件都是只有一个,因为我们没有配置分区数量,他默认的数量是1个,所以最终的输出文件都是1个
那么当我们需要要求将统计结果按照条件输出到不同文件中(分区)。比如:将统计结果按照手机归属地不同省份输出到不同文件中(分区)的时候,就需要去配置分区的相应代码
默认的Partitioner分区:
public class HashPartitioner<K, V> extends Partitioner<K, V> {
public HashPartitioner() {
}
public int getPartition(K key, V value, int numReduceTasks) {
return (key.hashCode() & 2147483647) % numReduceTasks;
}
}
这里的2147483647是2的31次方,是java int 类整数的最大值,也可以用Integer.MAX_VALUE
表示,默认分区是根据key的hashCode对ReduceTasks个数取模得到的,用户没法控制哪个key存储到哪个分区。
2. 自定义Partitioner步骤
- 自定义类继承Partitioner, 重写getPartition()方法
public class XXXXX extends Partitioner<XXX,XXX> {
@Override
public int getPartition(XXX key, XXX value, int numPartitions) {
//控制分区代码逻辑
.... ....
return partition;
}
}
- 在Driver驱动类中,设置自定义Partitioner
job.setPartitionerClass(XXXXX.class);
- 自定义Partition后