partition分区

  1. partition:用来指定map输出的key交给哪个reuducer处理
    默认是通过对map输出的key取hashcode对指定的reduce个数取余
    partition数决定reduce数,业务又决定reduce数

  2. 默认情况下,作业的ReduceNum=1,每一个Reduce对应生成一个结果文件。如果ReduceNum=0,则没有reduce阶段。

  3. partition如何分区:
    默认情况下,分区器采用:【org.apache.hadoop.mapreduce.Partitioner】抽象类
    类说明:分区器按key(k2中间值)进行分区,它提供了getPartition()方法用于获取当前key值对应的分区号(partition number)
    通常情况下,采用hash函数。分区总数与Job的reduce数量相同。

    public class HashPartitioner<K, V> extends Partitioner<K, V> {
    
      /** Use {@link Object#hashCode()} to partition. */
      public int getPartition(K key, V value,int numReduceTasks) {
        	return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
      }	
    }
    
  4. 建议:分区数等于reduce数
     如果分区数小于reduce数,则浪费资源
     如果分区数大于reduce数,则抛异常,如下:(此时我的partition数为3,NumReduceTasks数为2)
    在这里插入图片描述

  5. 自定义分区:继承Partitioner抽象类,重写getPartition()方法
    例如:将一个年龄文件分三个阶段:
    1)构建自定义的Partition类

    public class MyPartitioner extends Partitioner<IntWritable , IntWritable>{
    	//继承Partitioner抽象类
    	@Override
    	public int getPartition(IntWritable key, IntWritable value, int numPartitions) {
    		if(key.get()>=50){
    			return 0;//指定结果到第0个分区,part-r-00000
    		}else if(key.get()>10 && key.get()<50){
    			return 1;//part-r-00001
    		}else{
    			return 2;//part-r-00002
    		}
    	}	
    }
    

    2)在job文件中设置分区类和reduce数

    job.setPartitionerClass(MyPartitioner.Class);//设置自定义的分区类
    job.setNumReduceTasks(3);//与分区数保持一致
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值