Mapreduce中context的作用

在我们写mapreduce的程序时候总会有这么一段代码,这个代码就是map方法的实现,里面有一个参数 context对象,但是这个context对象究竟是干什么的呢?

  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对象很相似

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MapReduce的例题,有一个叫做GroupReduce的类,它是一个Reducer类。在这个类,我们可以看到reduce()方法的实现。这个方法接收一个OrderBean类型的key和一个Iterable<Text>类型的values作为参数,同时还有一个Context对象用来写出结果。在reduce()方法,我们可以看到通过一个for循环来遍历values,然后将每一个value写出到结果。同时,还有一个变量i用来记录写出的数据条数,并且在写出一条数据后,会进行判断,如果i大于等于1,则直接退出循环。这样,就实现了只取第一条数据的功能。这是一个处理数据的例子,它展示了MapReduce如何使用Reducer来处理数据并输出结果。 除此之外,关于MapReduce的例题还有很多。例如,在一个例题,我们可以使用MapReduce来统计一篇文章每个单词出现的次数。在这个例子Map阶段负责将文章切分成单词,并将每个单词作为key,将其出现的次数作为value输出。Reduce阶段负责对相同单词的出现次数进行累加,并将结果输出。 另一个例题是使用MapReduce来进行排序。在这个例子Map阶段负责读取输入数据,并按照某个字段进行排序,然后将排序结果作为key,并将原始数据作为value输出。Reduce阶段负责对相同key的数据进行归并,并将结果输出。通过这个例子,我们可以看到MapReduce的排序功能。 以上是一些关于MapReduce的例题,它们展示了MapReduce在数据处理和排序方面的应用。通过这些例子,我们可以更好地理解和掌握MapReduce的使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值