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。
这样就可把原本相同key分到不同reduce中,使得数据被打散。