partitioner in Hadoop

partitioner用来控制map task的中间输出记录的所处的分组的。
partitioner的接口如下:

abstract int 	getPartition(KEY key, VALUE value, int numPartitions)

通常我们使用Record的key来计算分组的值,计算方法一般是hash。
分组的总数和reduce task的个数一样,如果reduce task的个数是1或者0,partitioner不会起作用。
partitioner发生在map task结束之后,reduce task开始之前。
Hadoop会保证分组相同的Record(key value pair)会被发送到同一个reduce task去执行。
这一条是重点:我们可以使用这一特点来完成一些我们自己的特殊需求。
例如:假设我们的key是int,希望key 范围在0~100的Record,分到一个reduce task,其他的分到另外一个reduce task上去。我们就可以实现下面的partitioner:

int getPartition(KEY key, VALUE value, int numPartitions) {
  if(key >= 0 && key <= 100) {
      return 0;
  }
  return 1;
}

需要注意的是,如果我们写的partitioner不好的话,会导致某个reduce task收到很多的record来处理,从而会导致整个job的执行时间加长。

再例如:我们想对很多的数据进行排序,这里就可以使用到InputSampler + TotalOrderPartitioner,具体的可参见下面的链接:
http://blog.ditullio.fr/2016/01/04/hadoop-basics-total-order-sorting-mapreduce/

猜你喜欢

转载自blog.csdn.net/lantianjialiang/article/details/82811859