zoukankan      html  css  js  c++  java
  • Mapreduce学习之路三

    MR之分区:

    概述:

      1. 通过分区技术会将同一个分区的数据发送到同一个reduce当中进行处理

      2. 相同类型的数据即有共性的数据送到一块处理

      3. Reduce当中默认分区只有一个

    默认分区:

      默认分区是根据 Key 的HashCode 对ReduceTask取模而得到的,用户无法控制哪个Key存储到 那个分区

    public class HashPatitioner<K,V> extends Partitioner<K,V> {  // 继承Partitioner类
        public int getPartitioner(K key, V value, int numReduceTasks) {
            return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;  // Key的hashcode对reduceTask的个数取模 返回整型
        }
    }

    自定义分区:

    1. 继承Partitioner类,并重写getPartitioner() 方法

    public class MyPartitioner extends Partitioner<Text , FlowBean> {
        @Override
        public int getPartioner(Text key, FlowBean value, int numParttiions) {
            // 控制分区逻辑代码
            return partition;
        }
    }

    2. 在Job驱动中,设置Partitioner驱动类

    // 指定分区类
    job.setPatitionerClass(MyPartitioner.Class);

    3. 自定义分区之后,要在Job驱动类中,根据自定义的Partition逻辑设置影响数量的 ReduceTask

    // 分区数量依据分区类的逻辑空控制,如你所定义的逻辑需要5个分区,只能大于等于5,绝对不能小于5,否则报错
    job.setNumReduceTasks(5);  

    总结:

      1. 如果ReduceTask 大于 getPartition的结果数量,则会多产生几个空的输出文件 part-r-000xx;
      2. 如果ReduceTask 小于 ReduceTask的数量 ==小于== getPartition的结果数,则有一部分分区数据无处安放,会报错Exception;
      3. 如果ReduceTask数量 1,则不管MapTask端输出多少个分区文件,结果都在一个分区文件中
      4. 分区号必须从零开始,逐一累加

  • 相关阅读:
    雅虎网站页面性能优化的34条黄金守则
    borderimage
    jQuery实现滚动加载图片效果
    mysql数据库中创建与删除数据表
    (10)一步一步开发一个简单CAD之捕捉
    apach启动失败的原因
    (12)一步一步开发一个简单CAD之观察者模式
    简单基于OPENGL的三维CAD框架(1)照相机类
    简单基于OPENGL的三维CAD框架(1)COpenGLDC
    (13)一步一步开发一个简单CAD之像皮筋类
  • 原文地址:https://www.cnblogs.com/joey-413/p/13997887.html
Copyright © 2011-2022 走看看