hadoop开发必读:认识Context类的作用
问题导读: 1.Context能干什么? 2.你对Context类了解多少? 3.Context在mapreduce中的作用是什么?
本文实在能够阅读源码的基础上一个继续,如果你还不能阅读源码,请参考 从零教你如何获取hadoop2.4源码并使用eclipse关联hadoop2.4源码 如何通过eclipse查看、阅读hadoop2.4源码 下面我们通过来源码,来得到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方法
/**
* 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方法可以看出,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对象很相似。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python 爬虫篇-爬取网页中的图片,图片爬取实例演示。
- Python 爬虫进阶篇-4行代码实现爬取指定网站中的全部图片,深入剖析
- Python+selenium 自动化-基本环境搭建
- Java多线程与并发笔记
- Python 技术篇-pygame库实现播放音乐,带漂亮小界面!
- Java底层:GC相关
- Python 技术篇-pygame界面添加图片不显示,原因及解决办法
- SpringBoot集成Graylog
- Python 技术篇-pygame播放音乐没有声音,原因及解决办法
- Docker安装Graylog
- Spring Batch快速入门
- Python 技术篇-用PIL库修改图片尺寸
- 从行动上支持鸿蒙,HarmonyOS开发环境搭建快人一步
- 智能合约编程语言-solidity快速入门(下)
- Python 技术篇-用PIL库修改图片透明度,改变png图片色道为RGBA、RGB。