hadoop之Partitioner详解

Partitioner 的作用是对 Mapper 产生的中间结果进行分片,
以便将同一分组的数据交给同一个 Reducer 处理,它直接影响 Reduce 阶段的负载均衡。
Map阶段总共五个步骤

这里写图片描述

step1.3就是一个分区操作

Mapper最终处理的键值对<key, value>,是需要送到Reducer去合并的,合并的时候,
有相同key的键/值对会送到同一个Reducer节点中进行归并。

哪个key到哪个Reducer的分配过程,是由Partitioner规定的。
在一些集群应用中,例如分布式缓存集群中,缓存的数据大多都是靠哈希函数来进行数据的均匀分布的,在Hadoop中也不例外。
Hadoop内置Partitioner

MapReduce的使用者通常会指定Reduce任务和Reduce任务输出文件的数量(R)。
用户在中间key上使用分区函数来对数据进行分区,之后在输入到后续任务执行进程。
一个默认的分区函数式使用hash方法(比如常见的:hash(key) mod R)进行分区。
hash方法能够产生非常平衡的分区。
Hadoop中自带了一个默认的分区类HashPartitioner,
它继承了Partitioner类,提供了一个getPartition的方法

/** Partition keys by their {@link Object#hashCode()}. */
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;
  } 
}
key均匀布在Reduce Tasks上
(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 

如果KeyText的话,Text的hashcode方法跟String的基本一致,都是采用的Horner公式计算,得到一个int整数。
但是,如果string太大的话这个int整数值可能会溢出变成负数,所以和整数的上限值Integer.MAX_VALUE
(即0111111111111111)进行与运算,然后再对reduce任务个数取余,这样就可以让key均匀分布在reduce上 。
一般我们都会使用默认的分区函数HashPartitioner
当然自己可以定制自定制Partitioner

自定义LiuPartitioner框架

 public static class Self_Partitioner extends Partitioner<数据类型1, 数据类型2> {
        @Override
        public int getPartition(数据类型1 key, 数据类型2 value, int numPartitions) {

            /*分两个区,长度大于11和小于11的
            实现不同的长度不同的号码分配到不同的reduce task中
            int numLength = key.toString().length();
            if (numLength == 11) return 0;
            else   return 1;
           */ 

        }
    }

    job.setPartitionerClass(Self_Partitioner.class);
    job.setNumReduceTasks(2);
小结:分区Partitioner主要作用在于以下两点
 1、根据业务需要,产生多个输出文件
 2、多个reduce任务并发运行,提高整体job的运行效率

Hadoop学习笔记—9.Partitioner与自定义Partitioner

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值