Hadoop里的Partitioner

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的详细解释

Hadoop里的Partitioner

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


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116562.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月19日 下午6:00
下一篇 2022年1月19日 下午6:00


相关推荐

  • 网格搜索随机搜索相同点_网格搜索原理

    网格搜索随机搜索相同点_网格搜索原理https://www.bilibili.com/video/BV1S44y1r7qN?from=search&seid=3501694419494600913

    2026年4月13日
    4
  • 线性规划

    线性规划1、线性规划1.1线性规划的定义线性规划的标准形式:其中的c和x均为n维列向量,A、Aeq为适当维数的矩阵,b、beq为适当维数的列向量。例如:x1和x2称为决策变

    2022年7月3日
    22
  • 彻底搞懂golang的GOROOT和GOPATH

    彻底搞懂golang的GOROOT和GOPATH目录 1 GOPATH 和 GOROOT2 修改 GOPATH 和 GOROOT3 HelloWord GOPATH 版 4 一些踩坑经验 1 GOPATH 和 GOROOT 不同于其他语言 go 中没有项目的说法 只有包 其中有两个重要的路径 GOROOT 和 GOPATHGo 开发相关的环境变量如下 GOROOT GOROOT 就是 Go 的安装目录 类似于 java 的 JDK

    2026年3月19日
    1
  • Hadoop面试题总结「建议收藏」

    Hadoop面试题总结「建议收藏」Hadoop面试题总结1.hadoop的TextInputFormat作用是什么?如何自定义实现?InputFormat会在map操作之前对数据进行两方面的预处理:gitSplits,返回的是InputSplit数组,对数据进行split切片,每一个切片都需要一个map任务去处理。getRecordReader,返回的是RecordReader对象,将每个切片中的数据转换为<k…

    2022年6月16日
    33
  • Java锁——自旋锁和互斥锁的区别

    Java锁——自旋锁和互斥锁的区别自旋锁和互斥锁的区别自旋锁是一种互斥锁的实现方式而已 相比一般的互斥锁会在等待期间放弃 cpu 自旋锁 spinlock 则是不断循环并测试锁的状态 这样就一直占着 cpu 互斥锁 用于保护临界区 确保同一时间只有一个线程访问数据 对共享资源的访问 先对互斥量进行加锁 如果互斥量已经上锁 调用线程会阻塞 直到互斥量被解锁 在完成了对共享资源的访问后 要对互斥量进行解锁 临界区 每个进程中访问临界

    2026年3月10日
    4
  • struts2的拦截器AbstractInterceptor「建议收藏」

    struts2的拦截器AbstractInterceptor「建议收藏」publicclassAuthorizationInterceptorextendsAbstractInterceptor{@Override   publicStringintercept(ActionInvocationai)throwsException{      Map&lt;?,?&gt;session=ai.getInvocationConte…

    2022年5月14日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号