Hadoop里的Partitioner,HadoopPartitioner


人们对于Mapreduce程序刚开始时都认为只需要一个reduce就够了。毕竟,在你处理数据之前一个reducer已经把数据都分好类了,有谁不喜欢分好类的数据呢。但是这样我们就忽略了并行计算的优势。如果只有一个reducer,我们的云计算就退化成了一个小雨点。


在多个reducer的情况下,我们需要某种机制来控制mapper的结果的分配问题。这是就Partitioner的工作了。

在默认情况下,hadoop通过比较key的hash值来分配,默认使用HashPartitioner。有时默认的功能不能满足我们的要求,比如我们以前自定义的Edge类(http://blog.csdn.net/on_way_/article/details/8589187)。当我们想要知道每个机场乘客起飞的数量时。我们有如下数据

(北京, 上海)   张三

(北京, 青岛)  李四。。。。。。。

如果我们用HashPartitioner来分配,那么这两行就会被送往不同的reducer上,机场起飞的数量就会被算两次,而且每次都是错误的。

我们需要为我们的应用程序定制一个partitioner。

[java] view plaincopyprint?
  1. import org.apache.hadoop.io.Writable;  
  2. import org.apache.hadoop.mapred.JobConf;  
  3. import org.apache.hadoop.mapred.Partitioner;  
  4.   
  5.   
  6. public class EdgePartitioner implements Partitioner<Edge, Writable>{  
  7.   
  8.     @Override  
  9.     public void configure(JobConf job) {  
  10.         // TODO Auto-generated method stub  
  11.           
  12.     }  
  13.   
  14.     @Override  
  15.     public int getPartition(Edge key, Writable value, int numPartitions) {  
  16.         // TODO Auto-generated method stub  
  17.         return key.getDepartureNode().hashCode() % numPartitions;  
  18.     }  
  19.   
  20. }  

下面的这张图给出了Partitioner的具体解释

在map和reduce两个阶段之间,一个MapReduce程序必须把mapper的输出分配到多个reducer上,这个过程叫做shuffling,因为一个mapper的输出结果有可能被分配到集群中的多个节点中去。




对于Hadoop分区函数Partition的问题,解决给100分

是我理解力不够还是?
写个子类继承org.apache.hadoop.mapreduce.Partitioner,
然后重写getPartition方法,在run函数中指定
conf.setPartitionerClass(子类);
不清楚你的意图到底是什么,所以可能不是你要的答案
 

hadoop里有什机制

Hadoop的核心机制是通过HDFS文件系统和MapReduce算法进行存储资源、内存和程序的有效利用与管理。然后Hadoop还包括的项目:
mapreduce分布式处理模型;HDFS分布式文件系统;pig数据流语言和运行环境;hive分布式按列存储的数据仓库;HBase,ZooKeeper,Sqoop
 

相关内容

    暂无相关文章