问题导读:
1.Context能干什么?
2.你对Context类了解多少?
3.Context在mapreduce中的作用是什么?


本文实在能够阅读源码的基础上一个继续,如果你还不能阅读源码,请参考

从零教你如何获取hadoop2.4源码并使用eclipse关联hadoop2.4源码
http://www.aboutyun.com/thread-8211-1-1.html
如何通过eclipse查看、阅读hadoop2.4源码
http://www.aboutyun.com/thread-8225-1-1.html

下面我们通过来源码,来得到Context的作用:

下面主要对Setup函数进行深入探讨:首先看下两个程序的区别:
 
 
区别在于第一个程序把context这个上下文对象作为map函数的参数传到map函数中,第二个程序则是在setup函数中处理了context对象,从这个角度讲,在Map类的实例中是可以拿到Context这个上下文对象的,这一点是毋庸置疑的,不管是在类内部的哪个函数中使用都可以,既然是这样,那么讨论的重点就是map这个类中方法的声明及执行了,所以分析下Mapper类的源代码:
 
在mapper类中,只对这个方法进行了声明,也就是说它的子类可以重新实现这个方法,这一点很容易理解的。
下面从源码级分析下整个mapper类的结构和hadoop在设计这个类时的巧妙之处:
Map的主要任务就是把输入的key value转换为指定的中间结果(其实也是key value),这个类主要包括了四个函数:
 
Setup一般是在执行map函数前做一些准备工作,map是主要的数据处理函数,cleanup则是在map执行完成后做一些清理工作和finally字句的作用很像,下面看一下run方法:
 
这个方法调用了上面的三个函数,组成了setup-map-cleanup这样的执行序列,这一点和设计模式中的模版模式很类似,当然在这里我们也可以改写它的源码,比如可以在map的时候增加多线程,这样可以对map任务做进一步的优化,从以上的分析可以很清楚的知道setup函数的作用了。

下面为run方法

  1. /**
  2. * Expert users can override this method for more complete control over the
  3. * execution of the Mapper.
  4. * @param context
  5. * @throws IOException
  6. */
  7. public void run(Context context) throws IOException, InterruptedException {
  8. setup(context);
  9. try {
  10. while (context.nextKeyValue()) {
  11. map(context.getCurrentKey(), context.getCurrentValue(), context);
  12. }
  13. } finally {
  14. cleanup(context);
  15. }
  16. }

从上面run方法可以看出,K/V对是从传入的Context获取的。我们也可以从下面的map方法看出,输出结果K/V对也是通过Context来完成的。

那么我们上文中提到的Context对象是怎么回事呢?

原来它是mapper的一个内部类,简单的说顶级接口是为了在map或是reduce任务中跟踪task的状态,很自然的MapContext就是记录了map执行的上下文,在mapper类中,这个context可以存储一些job conf的信息,比如习题一中的运行时参数等,我们可以在map函数中处理这个信息,这也是hadoop中参数传递中一个很经典的例子,同时 context 作为了map和reduce执行中各个函数的一个桥梁,这个设计和java web中的session对象、application对象很相似。

hadoop开发必读:认识Context类的作用相关推荐

  1. Hadoop中Context类的作用和Mapper<LongWritable, Text, Text, LongWritable>.Context context是怎么回事【笔记自用】

    问题导读: 1.Context能干什么? 2.你对Context类了解多少? 3.Context在mapreduce中的作用是什么? 下面我们通过来源码,来得到Context的作用: 下面主要对Set ...

  2. Hadoop中Context类的作用

    问题导读: 1.Context能干什么? 2.你对Context类了解多少? 3.Context在mapreduce中的作用是什么? 下面我们通过来源码,来得到Context的作用: 下面主要对Set ...

  3. java中math类的作用_Java开发知识之Java的数字处理类Math类

    Java开发知识之Java的数字处理类Math类 一丶Java.text.DecimalFormat类与NumberFormat类 首先 Java.text.DecimalFormat指的是Decim ...

  4. Java开发必读--初识微服务一定要阅读这篇文章

    原文转自一线互联网资深架构师,微服务布道师小马哥的原创文章,始发与小马哥公众号. 微服务是什么? 微服务是一种细粒度(Fine-Grain)的SOA 或许在座的高朋了解过其概念.个人认为,与其说微服务 ...

  5. Hadoop完全分布式搭建过程、maven和eclipse配置hadoop开发环境、配置Map/Reduce Locations、简单wordcount测试!

    Hadoop完全分布式搭建及测试 项目开始前准备工作 1.下载并安装VM workstation pro 15安装包,这里选择: VMware-workstation-full-15.1.0-1359 ...

  6. Hadoop源码分析-Context

    学编程第一个肯定是hello world,Hadoop也不例外,它的hello world就是Wordcount,单词统计例子 1 package org.apache.hadoop.examples ...

  7. [原创] 毕设---在myeclipes中安装Hadoop开发插件

    1.安装Hadoop开发插件 hadoop安装包contrib/目录下有个插件hadoop-0.20.2-eclipse-plugin.jar,拷贝到myeclipse根目录下/dropins目录下. ...

  8. 配置HADOOP开发环境

    考虑到Windows平台尽管界面友好,但Hadoop环境配置较"怪异",需借助cygwin,这个过程并不优雅.正好我手上另有一套ubuntu环境,用着也很顺手,就在ubuntu中安 ...

  9. python抽象基类的作用_Python:多态、鸭子模型和抽象基类

    1. 多态 什么是多态 -- 多态,指的是一种事务具有多种形态: -- python是一种动态语言,默认支持多态,同一个方法 调用 不同的类对象 ,执行的 结果各不相同: 多态实现 -- 继承:不同子 ...

最新文章

  1. Android TabHost中切換、修改需要显示的Activity
  2. PHP对表单提交特殊字符的过滤和处理
  3. Vue项目中的初始化
  4. 如何用spring boot写一个注册页面
  5. [转载] Java中this和super关键字分别是什么意思
  6. 马上就要到了的即时通讯
  7. 查看vnc端口_如何在 Centos 8 / RHEL 8 上安装和配置 VNC 服务器
  8. java实验类与对象_【实验课件】上机实践2  类与对象
  9. 深度学习工作笔记003---数据预处理:独热编码(One-Hot Encoding)
  10. RocketMQ Message hasn‘t been sent. Caused by No route info of this topic, Pr
  11. oracle显示更新条数的函数,ORACLE学习笔记-添加更新数据函数篇
  12. Hash函数加密算法(一)
  13. 将文件夹内的所有文件重命名(从1开始发番)
  14. TomCat8080/8081端口占用问题!如何解决
  15. 计算机硬盘图标怎么更改,硬盘图标怎么改 更改本地磁盘图标方法
  16. 怎样才能无需训练也能成为武林高手
  17. 【转】图像视觉开源代码
  18. Comparable
  19. Qt使用QMediaplayer实现视频播放和简易音乐播放
  20. 学会这些句子,你还愁英语单词吗

热门文章

  1. 【Android 逆向】IDA 安装 ( 使用 IDA 分析 so 动态库 )
  2. 【Java 虚拟机原理】Class 字节码二进制文件分析 六 ( 属性类型 | Code 属性 | 属性名称索引 | 属性长度 | 操作数栈最大深度 | 局部变量存储空间 | 字节码长度 )
  3. 【计算理论】计算理论总结 ( 正则表达式转为非确定性有限自动机 NFA ) ★★
  4. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 简介 | 权限申请处理细节 | 添加依赖 | 界面权限申请结果处理 | 权限申请结果回调接口 )
  5. 【Android 应用开发】 ActionBar 基础
  6. spring第一个小例子(Spring_xjs1)
  7. 51NOD 1001 数组中和等于K的数对
  8. Linux目录与文件常见处理命令
  9. Joseph cicyle's algorithm
  10. 【代码片段】base样式--针对bootstrap