Mapreduce中context的作用
2016-08-14 23:47
302 查看
在我们写mapreduce的程序时候总会有这么一段代码,这个代码就是map方法的实现,里面有一个参数 context对象,但是这个context对象究竟是干什么的呢?
CONTEXT和其他类和其他接口的关系:
Context 类是Mapper 类的内部抽象类,它实现了MapContext 接口MapContext 里面可以得到split的信息,这个接口实现了 TaskInputOutputContext 这个接口
taskInputOutputContext 这个接口里面一些记录 getCurrentKey、getCurrentValue、nextKeyValue, getOutputCommitter(这个是一个OutputCommitter的抽象类,这个提供了提交的一些操作方法和属性)的方法,这个接口实现了TaskAttemptContext这个接口
TaskAttemptContext 这个接口保存了 task的一些信息,这个接口实现了JobContext和Progressable这个接口
JobContext和Progressable这个2个接口,这2个接口保存了job的信息和程序运行过程的进展
Mapper类:
从上面的源码可以看出来, setup方法来处理context对象,可以为对象增加一些新的成员,或者修改之前成员,从map方法来看,context对象是做为一个参数传给map函数,在Mapper类的实例中是可以拿到Context这个上下文对象的.
RUN方法:Setup一般是在执行map函数前做一些准备工作,map是主要的数据处理函数,cleanup则是在map执行完成后做一些清理工作和finally字句的作用很像,下面看一下run方法
这个方法调用了上面的三个函数,组成了setup-map-cleanup这样的执行序列,这一点和设计模式中的模版模式很类似,当然在这里我们也可以改写它的源码,比如可以在map的时候增加多线程,这样可以对map任务做进一步的优化,从以上的分析可以很清楚的知道setup函数的作用了,从上面run方法可以看出,K/V对是从传入的Context获取的。我们也可以从下面的map方法看出,输出结果K/V对也是通过Context来完成的。
总结:context它是mapper的一个内部类,简单的说顶级接口是为了在map或是reduce任务中跟踪task的状态,很自然的MapContext就是记录了map执行的上下文,在mapper类中,这个context可以存储一些job conf的信息,比如job运行时参数等,我们可以在map函数中处理这个信息,这也是hadoop中参数传递中一个很经典的例子,同时context作为了map和reduce执行中各个函数的一个桥梁,这个设计和java web中的session对象、application对象很相似
public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } }
CONTEXT和其他类和其他接口的关系:
Context 类是Mapper 类的内部抽象类,它实现了MapContext 接口MapContext 里面可以得到split的信息,这个接口实现了 TaskInputOutputContext 这个接口
taskInputOutputContext 这个接口里面一些记录 getCurrentKey、getCurrentValue、nextKeyValue, getOutputCommitter(这个是一个OutputCommitter的抽象类,这个提供了提交的一些操作方法和属性)的方法,这个接口实现了TaskAttemptContext这个接口
TaskAttemptContext 这个接口保存了 task的一些信息,这个接口实现了JobContext和Progressable这个接口
JobContext和Progressable这个2个接口,这2个接口保存了job的信息和程序运行过程的进展
Mapper类:
protected voidsetup(Context context ) throws IOException,InterruptedException { // NOTHING } @SuppressWarnings("unchecked") protected voidmap(KEYIN key, VALUEIN value, Context context) throws IOException,InterruptedException { context.write((KEYOUT) key, (VALUEOUT) value); } protected voidcleanup(Context context ) throws IOException,InterruptedException { // NOTHING }
从上面的源码可以看出来, setup方法来处理context对象,可以为对象增加一些新的成员,或者修改之前成员,从map方法来看,context对象是做为一个参数传给map函数,在Mapper类的实例中是可以拿到Context这个上下文对象的.
RUN方法:Setup一般是在执行map函数前做一些准备工作,map是主要的数据处理函数,cleanup则是在map执行完成后做一些清理工作和finally字句的作用很像,下面看一下run方法
public voidrun(Context context) throws IOException, InterruptedException { setup(context); try{ while(context.nextKeyValue()) { map(context.getCurrentKey(),context.getCurrentValue(), context); } } finally{ cleanup(context); } }
这个方法调用了上面的三个函数,组成了setup-map-cleanup这样的执行序列,这一点和设计模式中的模版模式很类似,当然在这里我们也可以改写它的源码,比如可以在map的时候增加多线程,这样可以对map任务做进一步的优化,从以上的分析可以很清楚的知道setup函数的作用了,从上面run方法可以看出,K/V对是从传入的Context获取的。我们也可以从下面的map方法看出,输出结果K/V对也是通过Context来完成的。
总结:context它是mapper的一个内部类,简单的说顶级接口是为了在map或是reduce任务中跟踪task的状态,很自然的MapContext就是记录了map执行的上下文,在mapper类中,这个context可以存储一些job conf的信息,比如job运行时参数等,我们可以在map函数中处理这个信息,这也是hadoop中参数传递中一个很经典的例子,同时context作为了map和reduce执行中各个函数的一个桥梁,这个设计和java web中的session对象、application对象很相似
相关文章推荐
- Hadoop_2.1.0 MapReduce序列图
- javascript prototype,executing,context,closure
- android基础教程之context使用详解
- Android编程中context及全局变量实例详解
- Android编程获取全局Context的方法
- 详解Android中的Context抽象类
- 安卓Android Context类实例详解
- 深入解析Android App开发中Context的用法
- MongoDB中的MapReduce简介
- Mongodb中MapReduce实现数据聚合方法详解
- MongoDB学习笔记之MapReduce使用示例
- MongoDB中MapReduce编程模型使用实例
- MapReduce中ArrayWritable 使用指南
- Java函数式编程(七):MapReduce
- java连接hdfs ha和调用mapreduce jar示例
- 用PHP和Shell写Hadoop的MapReduce程序
- Python的Django框架中的Context使用
- 详解Django框架中用context来解析模板的方法
- JavaScript mapreduce工作原理简析
- 在Django的通用视图中处理Context的方法