本帖最后由 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
|