Mapreduce的Partition分区介绍

MapReduce的Partition分区决定了 Shuffle 过程中 Reduce Task 的数量和输出文件的分布。默认分区根据 key 的 hashCode 取模 ReduceTask 数量,而自定义Partitioner则允许根据业务需求控制key的输出位置。在自定义Partitioner时,需继承Partitioner并重写getPartition方法,并在Driver中设置自定义分区和ReduceTask数量。分区策略不当可能导致额外的空文件或数据丢失。案例中展示了根据手机归属地省份进行分区的实现。
摘要由CSDN通过智能技术生成

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步骤

  1. 自定义类继承Partitioner, 重写getPartition()方法
public class XXXXX extends Partitioner<XXX,XXX> {
   
    @Override
    public int getPartition(XXX key, XXX value, int numPartitions) {
   
    //控制分区代码逻辑
    .... ....
    	return partition;
    }
}
  1. 在Driver驱动类中,设置自定义Partitioner
job.setPartitionerClass(XXXXX.class);
  1. 自定义Partition后࿰
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值