最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

[基础] hadoop开发必读:认识Context类的作用

[复制链接]
跳转到指定楼层
楼主
发表于 2014-6-29 13:56:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
[size=16.363636016845703px]问题导读:
1.Context能干什么?
2.你对Context类了解多少?
3.Context在mapreduce中的作用是什么?
从零教你如何获取hadoop2.4源码并使用eclipse关联hadoop2.4源码
如何通过eclipse查看、阅读hadoop2.4源码
下面我们通过来源码,来得到Context的作用:
[size=16.363636016845703px]下面主要对Setup函数进行深入探讨:首先看下两个程序的区别:
[size=16.363636016845703px]

[size=16.363636016845703px]

[size=16.363636016845703px]区别在于第一个程序把context这个上下文对象作为map函数的参数传到map函数中,第二个程序则是在setup函数中处理了context对象,从这个角度讲,在Map类的实例中是可以拿到Context这个上下文对象的,这一点是毋庸置疑的,不管是在类内部的哪个函数中使用都可以,既然是这样,那么讨论的重点就是map这个类中方法的声明及执行了,所以分析下Mapper类的源代码:

[size=16.363636016845703px]

[size=16.363636016845703px]在mapper类中,只对这个方法进行了声明,也就是说它的子类可以重新实现这个方法,这一点很容易理解的。

[size=16.363636016845703px]下面从源码级分析下整个mapper类的结构和hadoop在设计这个类时的巧妙之处:

[size=16.363636016845703px]Map的主要任务就是把输入的key value转换为指定的中间结果(其实也是key value),这个类主要包括了四个函数:

[size=16.363636016845703px]

[size=16.363636016845703px]Setup一般是在执行map函数前做一些准备工作,map是主要的数据处理函数,cleanup则是在map执行完成后做一些清理工作和finally字句的作用很像,下面看一下run方法:

[size=16.363636016845703px]

[size=16.363636016845703px]这个方法调用了上面的三个函数,组成了setup-map-cleanup这样的执行序列,这一点和设计模式中的模版模式很类似,当然在这里我们也可以改写它的源码,比如可以在map的时候增加多线程,这样可以对map任务做进一步的优化,从以上的分析可以很清楚的知道setup函数的作用了。

[size=16.363636016845703px]
下面为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);
  •     }
  •   }


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



[size=16.363636016845703px]那么我们上文中提到的Context对象是怎么回事呢?

[size=16.363636016845703px]
[size=16.363636016845703px]

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

评分

1

查看全部评分

楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

沙发
发表于 2014-6-30 10:41:37 | 只看该作者
阅,+赞。                        
板凳
发表于 2014-7-23 16:15:17 | 只看该作者
小手一抖,钱钱到手!
地板
发表于 2014-7-23 21:24:59 | 只看该作者
有道理。。。
5#
发表于 2014-7-25 11:49:35 | 只看该作者
相当不错,感谢无私分享精神!
6#
 楼主| 发表于 2014-7-25 12:48:26 | 只看该作者
路过,学习下
7#
发表于 2014-7-25 13:50:53 | 只看该作者
我是个凑数的。。。
8#
发表于 2016-2-29 12:28:05 | 只看该作者
讲的很好,感谢分享!!!!!!!!!!!!!!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-6-13 22:22

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表