人们对于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. public class EdgePartitioner implements Partitioner<Edge, Writable>{
  5. @Override
  6. public void configure(JobConf job) {
  7. // TODO Auto-generated method stub
  8. }
  9. @Override
  10. public int getPartition(Edge key, Writable value, int numPartitions) {
  11. // TODO Auto-generated method stub
  12. return key.getDepartureNode().hashCode() % numPartitions;
  13. }
  14. }

以下的这张图给出了Partitioner的详细解释

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hyaXN0cHJpbmNlMDA3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

Hadoop里的Partitioner的更多相关文章

  1. Hadoop中的Partitioner浅析

    转自:http://blog.csdn.net/b1198103958/article/details/47169105 Hadoop里面的MapReduce编程模型,非常灵活,大部分环节我们都可以重 ...

  2. Hadoop里的数据挖掘应用-Mahout——学习笔记<三>

    之前有幸在MOOC学院抽中小象学院hadoop体验课. 这是小象学院hadoop2.X的笔记 由于平时对数据挖掘做的比较多,所以优先看Mahout方向视频. Mahout有很好的扩展性与容错性(基于H ...

  3. day07 hadoop里面的RPC框架使用

    PS: RPC远程调用 Webservice啥的都是远程调用.下面简单介绍其使用过程 Hadoop已经实现了RPC框架,不用我们自己写,不过需要我们注意几点:1.发布服务端和客户端必须包名相同 1.服 ...

  4. 【hadoop】有参考价值的博客整理

    好文章的网址: hadoop shuffle机制中针对中间数据的排序过程详解(源代码级) Hadoop mapreduce原理学习 与 Hadoop 对比,如何看待 Spark 技术? 深入理解Had ...

  5. 如何使用Hadoop的Partitioner

    如何使用Hadoop的Partitioner 博客分类: Hadoop hadooppartition Hadoop里面的MapReduce编程模型,非常灵活,大部分环节我们都可以重写它的API,来灵 ...

  6. Hadoop学习笔记—9.Partitioner与自定义Partitioner

    一.初步探索Partitioner 1.1 再次回顾Map阶段五大步骤 在第四篇博文<初识MapReduce>中,我们认识了MapReduce的八大步凑,其中在Map阶段总共五个步骤,如下 ...

  7. hadoop streaming字段排序介绍

    我们在使用hadoop streaming的时候默认streaming的map和reduce的separator不指定的话,map和reduce会根据它们默认的分隔符来进行排序 map.reduce: ...

  8. hadoop之计数器和管道的mrunit测试

    引言 hadoop的调试真心让人灰常恼火,而且从企业实际出发,集群的资源是有限的,不可能在集群上跑一遍又一遍根据log去调试代码,那么使用MRUnit编写测试单元,显得尤为重要.MRUnit中的Map ...

  9. Hadoop的改进实验(中文分词词频统计及英文词频统计)(4/4)

    声明: 1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究. 2)本小实验工作环境为Windows系统下的百度云(联网),和Ubuntu系统的hadoop1-2-1(自己提前配好).如不 ...

随机推荐

  1. 【Nginx笔记】nginx配置文件具体解释

    本文主要对nginx的配置做重点说明,关于nginx的其他基本概念.建议參考官网描写叙述.这里推荐Nginx Beginner's Guide这篇文档.对刚開始学习的人高速认识nginx非常有帮助. ...

  2. crm使用FetchXml聚合查询

    /* 创建者:菜刀居士的博客  * 创建日期:2014年07月08号  */ namespace Net.CRM.FetchXml {     using System;     using Micr ...

  3. 【cocos2d-js公文】十七、事件分发机制

    简单介绍 游戏开发中一个非常重要的功能就是交互,假设没有与用户的交互.那么游戏将变成动画,而处理用户交互就须要使用事件监听器了. 总概: 事件监听器(cc.EventListener) 封装用户的事件 ...

  4. MSSQL - 通用存储过程

    通用插入存储过程: -- ============================================= -- Author: HF_Ultrastrong -- Create date: ...

  5. ASP.NET、HTML+CSS - 弹出提示窗体

    刷新数据,提示之后,CSS样式改变: 解决方案: 在ASP.NET中,如果是添加信息成功之后出现提示信息,那么只能用  ClientScript.RegisterStartupScript(this. ...

  6. [置顶] JSP分页,使用Hibernate+mysql

    此代码为博主参考巴巴运动网源码所得,大部分一样,略有修改,在这里分享给大家,也方便自己以后写代码直接copy,看网上很多分页代码JSP里是用JAVA代码,博主原来也是这样,看到源码了解了JSTL,建议 ...

  7. js获取当前日期,网页头部用

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  8. 实现 select中指定option选中触发事件

    我们在用到下拉列表框select时,需要对选中的<option>选项触发事件,其实<option>本身没有触发事件方法,我们只有在select里的onchange方法里触发. ...

  9. LCS小结(O(∩_∩)O~吽吽)

    LCS!~如果你在百度上搜这个的话会出来”英雄联盟冠军联赛”,orz..但是今天要讲的LCS是最长公共子序列 ,"Longest Common Subsequence "not&q ...

  10. HTTP POST请求的Apache Rewrite规则设置

    最近自测后端模块时有个业务需求需要利用WebServer(我用的是Apache)将HTTP POST请求转发至后端C模块,后端处理后返回2进制加密数据.http post请求的url格式为:     ...