MapReudce源码分析之Mapper
来源:互联网 发布:淘宝清退中小卖家 编辑:程序博客网 时间:2024/06/09 17:24
Mapper是MapReduce编程模型中一个将输入的key/value对映射成一组中间key/value对的组件。Map是将输入记录转换成中间记录的单个任务。被转换的中间记录不需要与输入记录一样的类型。一个给定的输入对可能被映射成0个货多个输出对。Hadoop的MapReduce框架为作业中输入格式InputFormat产生的每个输入分片InputSplit产生一个Map任务。通过JobContext的getConfiguration()方法,Mapper的实现者可以获得任务的配置信息。MapReduce框架中Map部分首先会调用setup()方法,然后接着为输入分片的每个KeyValue对调用map()方法进行处理,最见后再调用cleanup()方法。所有给定输出key相关的中间值随后会被框架进行分组,继而被传递给Reducer以确定最终的输出。通过指定两个关键的RawComparator类,用户可以控制排序和分组。Mapper输出被每个Reducer分区。通过实现一个定值分区器Partitioner,用户可以控制哪些key和相关记录进入哪个Reducer。
Mapper的执行主流程在其run()方法内,代码如下:
/** * Expert users can override this method for more complete control over the * execution of the Mapper. * 熟练或者老练的用户可以覆写该方法,以便更完整的控制Mapper的运行 * @param context * @throws IOException */ public void run(Context context) throws IOException, InterruptedException { // task开始运行时调用setup()方法进行初始化 setup(context); try { // 当context中仍有KeyValye对的话,一直循环 while (context.nextKeyValue()) { // 取出context中当前key、valye,连同context本身,调用map()方法处理 map(context.getCurrentKey(), context.getCurrentValue(), context); } } finally { // task结束运行时调用cleanup()方法进行清理 cleanup(context); } }run()方法执行的流程很简单,大体如下:
1、task开始运行时setup()初始化方法;
2、在try模块中,当context中仍有KeyValye对的话,一直循环:
取出context中当前key、valye,连同context本身,调用map()方法处理;
3、在finally模块中,task结束运行时调用cleanup()方法进行清理 。
是不是很简单,就像一个模板一样,按照setup()--map()--map()--......--map()--cleanup()的执行主线运行。而且,熟练或者老练的用户可以覆写该方法,以便更完整的控制Mapper的运行。
我们接下来再看下进行初始化的setup()方法和进行清理的cleanup()方法,代码如下:
/** * Called once at the beginning of the task. * task开始运行时调用一次,做初始化工作 */ protected void setup(Context context ) throws IOException, InterruptedException { // NOTHING }
/** * Called once at the end of the task. * task结束运行时调用一次,做清理工作 */ protected void cleanup(Context context ) throws IOException, InterruptedException { // NOTHING }这两个函数分别在task开始运行或结束运行时调用一次,一遍完成初始化或清理工作,用户可覆写这两个方法,以便实现自己的初始化或清理逻辑,或者,干脆不用管,那么这两个方法是空方法,什么都不会做。
再来看下实现KeyValue对转换的核心功能map()方法,代码如下:
/** * Called once for each key/value pair in the input split. Most applications * should override this, but the default is the identity function. * 针对输入分片split的每个key/value对都会调用一次。大多数应用程序应该覆写该方法,而默认实现是一个类似恒等式的功能,原样输出key、value */ @SuppressWarnings("unchecked") protected void map(KEYIN key, VALUEIN value, Context context) throws IOException, InterruptedException { context.write((KEYOUT) key, (VALUEOUT) value); }map()方法针对输入分片split的每个key/value对都会调用一次。大多数应用程序应该覆写该方法,而默认实现是一个类似恒等式的功能,原样输出key、value。
另外,Mapper中还有一个抽象内部类Context,它实现了MapContext接口,代表了Map任务运行时的上下文信息,我们后续再讲。
- MapReudce源码分析之Mapper
- Tomcat源码阅读之Mapper分析
- easy-mapper 源码分析
- mybatis源码分析之Mapper代理实现分析
- (5-3)Mapper源码分析
- Mybatis源码分析获取Mapper
- Hadoop中Mapper过程的源码分析
- Tomcat源码分析--资源映射器Mapper
- mybatis源码学习之执行过程分析(3)——mapper接口的获取
- Hadoop2.6.0版本MapReudce示例之WordCount(一)
- Hadoop2.6.0版本MapReudce示例之WordCount(二)
- device-mapper 之 dm-cache分析
- MapReduce之Mapper中的方法分析
- Mybatis3源码分析(三):解析mapper的xml配置文件
- MapReduce框架Mapper和Reducer类源码分析
- Mybatis3源码分析(三):解析mapper的xml配置文件
- Mybatis3源码分析(19)-Mapper生成过程-示例
- Mybatis3源码分析(20)-Mapper实现-配置加载
- [LeetCode]Power of Four
- mybatis存入数据库后没有时分秒时间不全只有年月日
- JDK1.7新特性(二)Fork/Join框架demo
- 上传大文件 NSInputStream
- 关于thinkcmf(挖个坑)
- MapReudce源码分析之Mapper
- c++ 字符串连接问题
- 输入流对象cin读取输入流的三种方式
- 求第k小的数
- iOS多线程的初步研究(四)-- NSTimer
- 十、深度优先搜索(DFS)
- 数据库结构设计的更改,默认不准,如何让它许可
- MSSQLSERVER 分区创建 分区合并删除 分区
- 部分和问题