MapReduce之Mapper源码

MapReduce之Mapper解析

    • 一、Mapper类源码
    • 二、Mapper类概述与作用
    • 三、Maps的数量
    • 四、Mapper的Context

一、Mapper类源码


  • Mapper源码如下,去除了类的注释,保留了方法上的注释
    package org.apache.hadoop.mapreduce;
    
    import java.io.IOException;
    import org.apache.hadoop.classification.InterfaceAudience;
    import org.apache.hadoop.classification.InterfaceStability;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.io.RawComparator;
    import org.apache.hadoop.io.compress.CompressionCodec;
    import org.apache.hadoop.mapreduce.task.MapContextImpl;
    
    @InterfaceAudience.Public
    @InterfaceStability.Stable
    public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
           
    
      /**
       * The Context passed on to the {@link Mapper} implementations.
       */
      public abstract class Context
        implements MapContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {
           
      }
      
      /**
       * Called once at the beginning of the task.
       */
      protected void setup(Context context
                           ) throws IOException, InterruptedException {
           
        // NOTHING
      }
    
      /**
       * Called once for each key/value pair in the input split. Most applications
       * should override this, but the default is the identity function.
       */
      @SuppressWarnings("unchecked")
      protected void map(KEYIN key, VALUEIN value, 
                         Context context) throws IOException, InterruptedException {
           
        context.write((KEYOUT) key, (VALUEOUT) value);
      }
    
      /**
       * Called once at the end of the task.
       */
      protected void cleanup(Context context
                             ) throws IOException, InterruptedException {
           
        // NOTHING
      }
      
      /**
       * Expert users can override this method for more complete control over the
       * execution of the Mapper.
       * @param context
       * @throws IOException
       */
      public void run(Context context) throws IOException, InterruptedException {
           
        setup(context);
        try {
           
          while (context.nextKeyValue()) {
           
            map(context.getCurrentKey(), context.getCurrentValue(), context);
          }
        } finally {
           
          cleanup(context);
        }
      }
    }
    
    

二、Mapper类概述与作用


  1. Mapper类的概述
    1. Mapper输入键/值对映射为一组中间键/值对
    2. Maps是一些独立的任务(Task)负责将输入记录转换为中间记录。转换后的中间记录不需要与输入记录具有相同的类型。一个给定的输入对(key/value pairs)可以映射到零或多个输出对(key/value pairs)。
    3. Hadoop MapReduce框架为作业的InputFormat生成的每个InputSplit生成一个map任务。换言之,【InputFormat】生成【InputSplit】,一个【map task】处理一个【InputSplit
    4. Mapper的实现类可以通过JobContextgetConfiguration()方法访问Job的Configuration类,用于获取相关的配置信息。
    5. 框架 首先 调用 setup() 方法,然后为 InputSplit 中的每个键/值对(key/value paris)调用 map() 方法。最后调用 cleanup() 方法。注意: 每一个InputSplit有多少个键值对(key/value pairs)就会调用多少次map()方法
    6. 与给定输出键(output key)相关联的所有中间值(intermediate values)随后由mapreduce框架分组,并传递给Reducer以确定最终输出。用户可以通过Job.setGroupingComparatorClass()方法指定Comparator来控制分组。
    7. Mapper输出被排序,然后对每个Reducer进行分区。分区的总数reduce task的数量相同。通过实现自定义Partitioner,用户可以控制哪个键(以及记录)转到哪个Reducer。
    8. 排序中间输出始终以简单的格式(key-len, key, value-len, value)存储。 应用程序可以通过配置控制是否以及如何压缩中间输出以及使用CompressionCodec。
    9. 如果当前Job没有reduce或者有0个reduce,那么Mapper的输出将直接写入OutputFormat,而不按键(key)进行排序。
  2. setup方法
    在任务开始时调用一次。注意:仅仅只调用一次。
  3. map方法
    对输入分片(InputSplit)中的每个键/值对(key/value pairs)调用一次。大多数应用程序应该覆盖它,编写自己的业务逻辑。默认是恒等函数
  4. cleanup方法
    在任务结束时调用一次,释放相关资源。
  5. run方法:专家用户可以重写此方法,以更完全地控制Mapper的执行。
    public void run(Context context) throws IOException, InterruptedException {
           
        setup(context);
        try {
           
          while (context.nextKeyValue()) {
           
            map(context.getCurrentKey(), context.getCurrentValue(), context);
          }
        } finally {
           
          cleanup(context);
        }
      }
    

三、Maps的数量


  • maps的数量通常由输入的总大小决定,即输入文件块的总数量。
  • maps的正确并行级别似乎是每个节点10-100个maps,对于那些占用cpu资源相对较少的map task,可以设置为300个maps。
  • map task设置需要一段时间,所以最好至少花一分钟来执行map task。
  • 因此,如果您期望10TB的输入数据和128MB的块大小,那么您最终将得到82,000个映射,除非Configuration.set(MRJobConfig。NUM_MAPS, int)(它仅为框架提供一个提示)被用来将其设置得更高。

四、Mapper的Context


  1. Mapper的Context继承关系
    MapReduce之Mapper源码_第1张图片

  2. MRJobConfig:将所有属性名都放在这里,以便Job和JobContext保持一致。
    MapReduce之Mapper源码_第2张图片

  3. Progressable:报告程序运行进度的工具类,客户端和/或应用程序可以使用提供的Progressable向Hadoop框架显式报告进度。

  4. JobContext:任务运行时提供给任务的作业的只读视图。
    MapReduce之Mapper源码_第3张图片

  5. TaskAttemptContext:任务尝试的上下文,包含方法如下:
    MapReduce之Mapper源码_第4张图片

  6. TaskInputOutputContext:允许任务输入和输出的上下文对象。它只提供给Mapper或Reducer。
    MapReduce之Mapper源码_第5张图片

  7. MapContext:Mapper的上下文。获取此映射的输入分片(InputSplit)。

    public interface MapContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> 
      extends TaskInputOutputContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {
           
      /**
       * Get the input split for this map.
       */
      public InputSplit getInputSplit();
    }
    

暂时写到这里,有时间再补充~~~

你可能感兴趣的:(Hadoop,hadoop,mapreduce)