• MapReduce格式与类型


    MapReduce Types

      MapReduce是一个简单的数据处理模型,map与reduce的输入和输出类型都为key-value形式的键值对。

    map: (K1, V1) → list(K2, V2)
    reduce: (K2, list(V2)) → list(K3, V3)
    

      一般来讲,map的输入key与输出value类型(K1,V1)不同于map的输出类型(K2,V2).reduce的输入类型比如与map的输出类型保持一致,reduce的输出类型可能会有不同的形式(K3,V3)。下面是JAVA API:

    public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
      public class Context extends MapContext<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
        // ...
      }
      protected void map(KEYIN key, VALUEIN value, 
                         Context context) throws IOException, InterruptedException {
        // ...
      }
    }
    
    public class Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
      public class Context extends ReducerContext<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
        // ...
      }
      protected void reduce(KEYIN key, Iterable<VALUEIN> values,
                            Context context) throws IOException, InterruptedException {
        // ...
      }
    }
    

      最终由context调用write()方法将key-value pairs输出

    public void write(KEYOUT key, VALUEOUT value)
        throws IOException, InterruptedException
    

      Mapper与Reducer是两个不同的classes,分别具有不同的入参类型,Mapper的入参类型可能与Reducer的入参类型不同,比如Mapper的key的入参为LongWritable,reduce的为Text.

      这里有一点,如果在map阶段调用了combine方法,那么就与reduce的入参相同

    map: (K1, V1) → list(K2, V2)
    combine: (K2, list(V2)) → list(K2, V2)
    reduce: (K2, list(V2)) → list(K3, V3)
    

      使用parition方法对中间结果的key与value进行操作时,将会返回parition的位置(index),parition将决定于排过序的key

    public interface Partitioner<K2, V2> extends JobConfigurable {
      int getPartition(K2 key, V2 value, int numPartitions);
    }
    

      默认的分区类型为HashPartitioner,由它决定着key属于哪个分区,每一个分区都属于一个reduce task,所以分区的个数决定了reduce tasks的个数

    public class HashPartitioner<K, V> extends Partitioner<K, V> {

    public int getPartition(K key, V value, int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; } }

      当你需要多个reduce tasks作业任务时,HashPartitioner就举足轻重了,因为map的结果将会传递给多个reduce,那么相同的key将会被分发到不同reduce task,大大提升了作业效率。那么reduce个数的决定了整个作业的并行度,有人会问,那map的个数呢,map的个数是由文件的block数目决定的,具体下面再说~

      那么reducer个数的把握将会是一门艺术- -增加reducer的个数相当于增加了并行度。

    较小的文件与CombineFileInputFormat

      Hadoop的作业适用于较大的文件,原因在于FileInputFormat是split整个文件还是split单个文件,如果文件太小(这里指的是小于HDFS的block块大小)并且拥有很多这样的文件,那么就会增加打开文件的性能开销。同时,大量的小文件也会增加namenode的元数据的存储开销。

    参考文献:《Hadoop:The Definitive Guide, 4th Edition》

  • 相关阅读:
    内存访问可以使用段地址+冒号+偏移地址的形式吗?
    更改Word、PowerPoint、Excel(Office套件)的主题为暗黑色
    埃拉托斯特尼筛法找质数
    引水入城
    线段树 区间乘
    会场预约
    借教室 线段树and二分
    数轴染色
    线段树 区间加
    树集
  • 原文地址:https://www.cnblogs.com/yangsy0915/p/5560473.html
Copyright © 2020-2023  润新知