利用hadoop的partition将数据打散

1、应用场景介绍
在日志统计分析的过程中,我们不仅需要对数据进行排序处理,而且还需要对数据进行打散处理。特别是在对海量url进行抓取的时候,由于海量url中同一站点下的url比较多,这样为我们抓取造成困难,因此,需要将url进行打撒处理,使得url尽量的分散开。
由于map-reduce的核心就是sort,该框架会将相同的key在reduce中处理,因此,我这里利用partition对key进行重新分区,使得相同的key分散到不同的reduce中,这样就可以将数据打散。

2、partition介绍
这里先简单介绍下partition。Hadoop中为我们提供了以下几种partition:
(1)Partitioner是partitioner的基类,如果需要定制partitioner也需要继承该类。(我这里采用这种方法实现打散)
(2)HashPartitioner是MapReduce的默认partitioner。计算方法是
     reduce=(key.hashcode()&Integer.MAX_VALUE)%numReduceTasks,得到当前的目的reducer。
(3)BinaryPatitioner继承于Partitioner<BinaryComparable,V>,是Partitioner的偏特化子类。该类提供leftOffset和rightOffset,在计算reduce=(hash&Integer.MAX_VALUE)%numReduceTasks
(4)KeyFieldBasedPartitioner也是基于hash的partitioner。和BinaryPartitioner不同,它提供了多个区间用于计算hash。当区间数为0时,KeyFieldBasedPartitioner退化成HashPartitioner。
(5)TotalOrderPartitioner这个类可以实现输出的全排序。不同于以上3个partitioner,这个类并不是基于hash的。详细介绍

3、计算方法
如上面介绍,我这里采用定制partitioner,继承Partitioner。

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public static class RandomPartitioner   extends Partitioner<Text,Text>  
  2. {  
  3.  @Override  
  4.      public int getPatition(Text key,Text value,int redueceNumber)  
  5.      {  
  6.          return (int)((key.hashcode()*Match.random())&Integer.MAX_VALUE)%numReduceTasks;  
  7.             
  8.      }  
  9. }  
这样就可把原本相同key分到不同reduce中,使得数据被打散。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值