Mapper类/Reducer类中的setup方法和cleanup方法以及run方法的介绍

在hadoop的源码中,基类Mapper类和Reducer类中都是只包含四个方法:setup方法,cleanup方法,run方法,map方法。


/**
   * 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);
       }
  }

可以看出,在run方法中调用了上面的三个方法:setup方法,map方法,cleanup方法。其中setup方法和cleanup方法默认是不做任何操作,且它们只被执行一次。但是setup方法一般会在map函数之前执行一些准备工作,如作业的一些配置信息等;cleanup方法则是在map方法运行完之后最后执行 的,该方法是完成一些结尾清理的工作,如:资源释放等。如果需要做一些配置和清理的工作,需要在Mapper/Reducer的子类中进行重写来实现相应的功能。map方法会在对应的子类中重新实现,就是我们自定义的map方法。该方法在一个while循环里面,表明该方法是执行很多次的。run方法就是每个maptask调用的方法。



### Hadoop 中 Mapper 的作用 Mapper 在 Hadoop 的 MapReduce 编程模型中扮演着至关重要的角色。该主要用于处理输入数据并生成中间键值对。具体来说,Mapper 将接收到的数据集分割成更小的部分,并行化处理这些部分以提高效率[^3]。 ```java public class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); StringTokenizer tokenizer = new StringTokenizer(line); while (tokenizer.hasMoreTokens()) { word.set(tokenizer.nextToken()); context.write(word, one); } } } ``` 这段代码展示了如何创建一个简单的 `MyMapper` 来统计单词频率。这里继承了 `Mapper` 抽象,并实现了其核心方法——`map()` 方法,在此过程中读取输入文件的一行作为参数传入,再利用字符串操作工具包将这一行拆分为多个词语,最后把每一个词都映射为 `<word, 1>` 形式的键值对输出给后续阶段使用[^2]。 ### Reducer 的功能描述 Reducer 接收来自 Mapper 输出后的经过排序分组之后的键值对集合,对其进行聚合运算得到最终的结果。Reducer 同样也包含了三个重要组件:`setup()`, `reduce()`, `cleanup()` 函数[^1]。 - **Setup**: 初始化工作可以在 setup 阶段完成; - **Reduce**: 实际业务逻辑的核心所在,接收一组相同 Key 对应 Value 列表的形式进行加工转换; - **Cleanup**: 清理资源或保存临时状态信息等扫尾性质的工作在此处执行; 下面是一个典型的 WordCount 应用程序中的 Reduce 过程: ```java public class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); } } ``` 上述例子中定义了一个名为 `MyReducer` 的,它负责累加由同一关键词关联起来的所有整数值,从而得出每个唯一词条在整个文档集中出现次数总的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值