分享

通过DistributedCache在TaskTracker之间共享数据

pig2 2014-3-15 21:39:10 发表于 代码分析 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 9446
本帖最后由 pig2 于 2014-3-15 21:43 编辑
我们可能了解JobTracker,TaskTracker,那么我们在生产环境中,即在真正的集群中,我们会遇到什么问题。可能我们也知道DistributedCache,那么两者之间有什么联系。
1.为什么TaskTracker之间需要共享数据?
2.DistributedCache的作用是什么?


已有(3)人评论

跳转到指定楼层
pig2 发表于 2014-3-15 21:46:01
本帖最后由 pig2 于 2014-3-15 21:52 编辑

阅读下面内容可以先了解:

我们的作业在提交给JobTracker之后,由JobTracker分发到各个TaskTracker节点去执行,有些TaskTracker节点运行Mapper任务,有些TaskTracker节点运行Reducer任务。在任务运行过程中,可能需要用到外部的数据或者文件,比如指定某个运行时参数的值,或者使用非常小的配置文件,怎么把这些值或者文件传递给各个TaskTracker哪?
1. 使用Configuration
Configuration类是框架提供的用于读取系统提供的配置文件内容,如core-default.xml等,也可以读取自定义的配置文件。
可以在驱动代码中,调用Configuration对象的set(...)方法赋值,如图1-15所示。

图1-15
然后在Mapper类或者Reducer类中通过Mapper或者Reducer的内部类Context获取Configuration对象,然后再调用get(...)方法,如图1-16所示。

图1-16

这种数据处理方式适合传递简单的键值对,不适合传递很多数据,也不适合传递数据文件。

2. 使用分布式缓存
DistributedCache是框架提供的一个分布式缓存工具,它通过访问hdfs,可以使得一个job中的所有map或者reduce访问同一份文件。当在作业运行前,首先DistributedCache会先把文件复制到任务所在节点的磁盘上,然后节点上的任务就可以加载该文件了。
在使用时,首先在驱动代码中调用addCacheFile(...)方法,如图1-17所示。

图1-17
在作业运行时,框架会把该文件复制到运行任务的TaskTracker的linux磁盘上,然后在Mapper或者Reducer任务中调用getLocalCacheFile(...)方法就可以获得缓存在运行当前任务的linux上的文件路径了,如图1-18所示。

图1-18

可以看到,使用DistributedCache还是非常简单的。如果不使用它,我们只能把共享的文件手工放到所有的TaskTracker的指定linux文件中,当集群非常庞大时,工作量还是很大的,使用DistributedCache后就不需要我们自己管了。

要注意的一点是,如果缓存的文件是jar,那么在使用其包含的类时应该使用反射机制,因为jar所在的路径不在框架的类路径下,无法正常加载,如图1-19所示。

图1-19

回复

使用道具 举报

wordwan@163.com 发表于 2014-8-19 10:10:49
没看明白,望大神指点
回复

使用道具 举报

8023K 发表于 2015-1-14 14:41:25
有些细节还是不太清楚,不过大体机制理解叻,楼主写的东西挺好~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条