mapreduce patitioner

mapreduce patitioner


mapreduce中的patitioner可以对key进行分区,即可以把map的输出结果均匀的输入到reducer中。其中mapreduce实现了4中patitioner。同时在有些情况下也能避免出错,因为默认情况下的hashpatitioner会出错


hadoop支持的partitioner
1,HashPartitioner是mapreduce默认的partitioner计算方法为:
which reducer = ((key.hashCode) & Integer.MAX_VALUE) % numReduceTasks

2,BinaryPatitioner继承于Partioner<BinaryComparable,V> 是partitioner的偏特化子类,该类提供了leftOffset和rightOffset,在计算which reducer时候仅仅对键值K的rightOffset,leftOffset这个更区间取hash
which reducer = ((code) & Integer.MAX_VALUE) % numReduceTasks

3,KeyFieldBasedPartitioner 也是基于hash的,和binaryPatitioner不同的是,她提供了多个区间用于计算hash,当区间的数为0时KeyFieldBasedPartitioner退化为HashPartitioner

4,TotalOrderPatitioner可以实现输出的全排序,不同于以上3个的是,这个类并不是基于hash的


默认的为HashPartitioner

public class HashPartitioner<K, V> extends Partitioner<K, V> { 


  public int getPartition(K key, V value, 
                          int numReduceTasks) { 
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 
  } 


刚开始其实没理解key.hashCode() & Integer.MAX_VALUE。主要是对逻辑运算又模糊了。

逻辑运算符 
    逻辑运算符要求操作数的数据类型为逻辑型,其运算结果也是逻辑型值。逻辑运算符有:逻辑与(&&)、逻辑或(||)、逻辑非(!)、逻辑异或(^)、逻辑与(&)、逻辑或(|)。
    真值表是表示逻辑运算功能的一种直观方法,其具体方法是把逻辑运算的所有可能值用表格形式全部罗列出来。Java语言逻辑运算符的真值表如下:


A         B           A&&B    A||B    !A       A^B      A&B      A|B
false  false    false     false   true   false    false     false
true    false    false     true    false  true      false     true
false  true      false     true    true    true      false     true
true    true      true      true    false   false    true      true 

要说明的是,两种逻辑与(&&和&)的运算规则基本相同,两种逻辑或(||和|)的运算规则也基本相同。其区别是:&和|运算是把逻辑表达式全部计算完,而&&和||运算具有短路计算功能。所谓短路计算,是指系统从左至右进行逻辑表达式的计算,一旦出现计算结果已经确定的情况,则计算过程即被终止。对于&&运算来说,只要运算符左端的值为false,则因无论运算符右端的值为true或为false,其最终结果都为false。所以,系统一旦判断出&&运算符左端的值为false,则系统将终止其后的计算过程;对于 || 运算来说,只要运算符左端的值为true,则因无论运算符右端的值为true或为false,其最终结果都为true。所以,系统一旦判断出|| 运算符左端的值为true,则系统将终止其后的计算过程。 

HashPartitioner中的key.hashCode()因为有可能超出int的最大值而产生溢出变为负数,因此与Integer.MAX_VALUE进行了逻辑与运算。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值