一、MapReduce Mapper

1. Mapper源码类

  1. // Hadoop mapreduce Mapper 类源码
  2. package org.apache.hadoop.mapreduce;
  3. import java.io.IOException;
  4. import org.apache.hadoop.classification.InterfaceAudience.Public;
  5. import org.apache.hadoop.classification.InterfaceStability.Stable;
  6. @Public
  7. @Stable
  8. public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
  9. public Mapper() {
  10. }
  11. protected void setup(Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context) throws IOException, InterruptedException {
  12. }
  13. protected void map(KEYIN key, VALUEIN value, Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context) throws IOException, InterruptedException {
  14. context.write(key, value);
  15. }
  16. protected void cleanup(Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context) throws IOException, InterruptedException {
  17. }
  18. public void run(Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context) throws IOException, InterruptedException {
  19. this.setup(context);
  20. try {
  21. while(context.nextKeyValue()) {
  22. this.map(context.getCurrentKey(), context.getCurrentValue(), context);
  23. }
  24. } finally {
  25. this.cleanup(context);
  26. }
  27. }
  28. public abstract class Context implements MapContext<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
  29. public Context() {
  30. }
  31. }
  32. }

2. 源码类解析

从源码中我们可以看出,Mapper类总共包含四个方法,一个抽象类

  1. setup() 方法 —- 一般作为map()方法的准备工作,进行相关配置文件的读取、参数的传递
  2. cleanup() 方法 —- 用来做一些收尾工作,如关闭文件,key-value的分发;
  3. map() 方法 ——是真正的程序逻辑部分,如对一行文本的split、filter 处理之后,将数据以key-Value的形式写入context;
  4. run()方法—是驱动整个Mapper执行的一个方法,按照run()>>setup()>>map()>>cleanup()顺序执行;
  5. Context抽象类—是Mapper里的一个内部抽象类,主要是为了在Map任务或者Reduce任务中跟踪task的相关状态和数据的存放。如Context可以存储一些jobConf有关的信息,在setup()方法中,就可以用context读取相关的配置信息,以及作为key-Value数据的载体。(Context比较复杂,以后可以单独介绍)