人们对于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. TensorFlow实现与优化深度神经网络

    TensorFlow实现与优化深度神经网络 转载请注明作者:梦里风林Github工程地址:https://github.com/ahangchen/GDLnotes欢迎star,有问题可以到Issue ...

  2. cocos2d-x游戏开发系列教程-前言

    cocos2d-x游戏开发前景: 最近企业对于Cocos2D-X开发人才的用人需求很大,而且所提供的薪资相当可观. 为满足广大向往游戏开发行业同学的需求,特推出适合新手的Cocos2D-X手游开发教程 ...

  3. ALV编辑行内容有改变时候操作

    ALV编辑行内容时,调用方法 check_changed_data返回变量 gf_valid = 'X'的话说明alv行有变化. 以下拿alv维护表程序部分代码做例: DATA: gr_alvgrid ...

  4. VC 绘图技巧--自定义形状图形

    自定义形状图形,定义几个点围城的图形,然后进行描边和填充: if (m_memDC.m_hDC!=NULL) { CPoint point[4]; point[0].x=nLeft+(int)(0.1 ...

  5. 【PAT】1035. Password (20)

    题目:http://pat.zju.edu.cn/contests/pat-a-practise/1035 分析:简单题.直接搜索,然后替换,不会超时,但是应该有更好的办法. 题目描述: To pre ...

  6. [More Effective C++]条款22有关返回值优化的验证结果

    (这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...

  7. 怎么用CIFilter给图片加上各种各样的滤镜_1

    近期在做对图像处理的app,而要对图像进行处理,CoreImage是离不开的框架. 上网Google了一下,大部分的博客都是仅仅讲了怎么给图像加上怀旧(CISepiaTone).模糊(CIBloom) ...

  8. Android开发调试日志工具类[支持保存到SD卡]

    直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.i ...

  9. 百度搜索结果页url参数详解

    在百度首页输入任意关键词搜索之后,我们跳转到搜索结果页面,在浏览器的网址栏我们可以看到很长的一串url地址.那么,你真的了解这一串url的含义吗? s?:搜索 百度搜索结果页使用了重定向,因此我们看到 ...

  10. Delphi的VMT的结构图,很清楚

    Every Delphi class is defined internally by its vmt—​its virtual-method table. The vmt contains a li ...