• Hadoop里的Partitioner


    人们对于Mapreduce程序刚開始时都觉得仅仅须要一个reduce就够了。

    毕竟,在你处理数据之前一个reducer已经把数据都分好类了,有谁不喜欢分好类的数据呢。

    可是这样我们就忽略了并行计算的优势。

    假设仅仅有一个reducer。我们的云计算就退化成了一个小雨点。


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

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

    (北京。 上海)   张三

    (北京。 青岛)  李四。

    。。。。。

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

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

    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的输出结果有可能被分配到集群中的多个节点中去。



  • 相关阅读:
    字符,字符串,字节
    111
    串口通信
    字符编码
    枚举和结构体
    参数数组
    .Net垃圾回收机制
    try{ } catch{ } finally{ }
    LVS 工作原理图文讲解
    自动化运维工具—Ansible常用模块二
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5074063.html
Copyright © 2020-2023  润新知