zoukankan      html  css  js  c++  java
  • MapReduce源码Mapper和Reducer


    1、Mapper类,有setup()、map()、run()、cleanup()这4个方法,如下:
        setup():在run方法执行前首先被调用,且只调用1次,通常用于初始化。
        map():需要重写的方法,此方法中实现业务逻辑。run方法会循环遍历,为每个key、value调用一次这个方法。
        run():此方法由框架控制执行。
        cleanup():map函数处理完所有的key、value会停止遍历,接下来调用此方法1次用于清理。
        
        Mapper类源码如下:    
            public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {

              public abstract class Context implements MapContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {}
              
              protected void setup(Context context) throws IOException, InterruptedException {}

              @SuppressWarnings("unchecked")
              protected void map(KEYIN key, VALUEIN value, Context context) throws IOException, InterruptedException {
                context.write((KEYOUT) key, (VALUEOUT) value);
              }

              protected void cleanup(Context context) throws IOException, InterruptedException {}

              public void run(Context context) throws IOException, InterruptedException {
                setup(context);
                try {
                  while (context.nextKeyValue()) {
                    map(context.getCurrentKey(), context.getCurrentValue(), context);
                  }
                } finally {
                  cleanup(context);
                }
              }
              
            }

    2、Reducer类,有setup()、reduce()、run()、cleanup()这4个方法,如下:
        setup():在run方法执行前首先被调用,且只调用1次,通常用于初始化。
        reduce():需要重写的方法,此方法中实现业务逻辑。run方法会循环遍历,为每个key、value调用一次这个方法。
        run():此方法由框架控制执行。
        cleanup():reduce函数处理完所有的key、value会停止遍历,接下来调用此方法1次用于清理。
        
        Reducer类源码如下:    
            public class Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {

              public abstract class Context implements ReduceContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {}

              protected void setup(Context context) throws IOException, InterruptedException {}

              @SuppressWarnings("unchecked")
              protected void reduce(KEYIN key, Iterable<VALUEIN> values, Context context) throws IOException, InterruptedException {
                for(VALUEIN value: values) {
                  context.write((KEYOUT) key, (VALUEOUT) value);
                }
              }

              protected void cleanup(Context context) throws IOException, InterruptedException {}

              public void run(Context context) throws IOException, InterruptedException {
                setup(context);
                try {
                  while (context.nextKey()) {
                    reduce(context.getCurrentKey(), context.getValues(), context);
                    // If a back up store is used, reset it
                    Iterator<VALUEIN> iter = context.getValues().iterator();
                    if(iter instanceof ReduceContext.ValueIterator) {
                      ((ReduceContext.ValueIterator<VALUEIN>)iter).resetBackupStore();        
                    }
                  }
                } finally {
                  cleanup(context);
                }
              }
              
            }

  • 相关阅读:
    20155327 2017-2018-2 《Java程序设计》第9周学习总结
    20155327《Java程序设计》第八周学习总结
    实验二 Java面向对象程序设计
    20155327 李百乾 Exp4 恶意代码分析
    20155327结对编程练习
    20155327第七周学习总结
    2017-2018-1 20155310 20155337 实验五 通讯协议设计
    # 2017-2018-1 20155337《信息安全系统设计基础》第十三周学习总结
    # 20155337 2017-2018 1 课上测试、课下作业、实验
    # 课下测试ch02
  • 原文地址:https://www.cnblogs.com/mengyao/p/4869454.html
Copyright © 2011-2022 走看看