hadoop懒惰的distributedcache

时间:2013-08-28 23:10:51

标签: java hadoop mapreduce lazy-evaluation distributed-caching

鉴于一个hadoop集群,我有一份工作,我有一大堆文件需要所有工人在执行减少阶段时访问。

使用DistributedCache的功能似乎是个好主意。但是,它似乎不满足以下所需的行为:

  • 懒惰文件获取:文件被懒惰地复制到工作者(仅限于 试图读取它们是否在本地缓存。

  • getLocalCacheFiles很奇怪:另一个明显相关的问题是 DistributedCache接口。一个,访问本地文件似乎 需要调用DistributedCache.getLocalCacheFiles(conf)。有没有 只按名称请求某个文件的方法(例如: DistributedCache.getLocalFile(conf,fileName))

DistributedCache可以这样做吗?还有其他图书馆满足我的要求吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

分布式缓存不支持延迟加载,它们会在第一个map / reduce任务之前复制到每个任务节点,以便在该节点上执行作业(请注意,文件仅复制到地图/的节点)减少任务将发生)。如果你想延迟加载,只需直接在HDFS中打开文件,虽然如果你有1000个并发任务试图从同一个文件中读取,这对你的namenode / datanodes来说也不能很好地扩展

您可以使用符号链接为分布式缓存友好名称提供文件,并且它们将显示在每个map / reduce任务的本地工作目录(符号链接)中。

例如,使用通用选项解析器选项-files,您可以将文件上传到HDFS,将其添加到DistributedCache并分配友好名称,如下所示:

hadoop jar myjar.jar MainClass -files ref-map.txt#map1.txt ...

现在你应该可以通过在map / reducer中调用以下内容来打开ref-map.txt文件:

File map1 = new File("map1.txt");

如果您的文件已经在HDFS中,那么只需正常添加,然后调用createSymlink(Configuration)方法。在将文件添加到分布式缓存时,您还可以使用片段URI分配友好的nanes:

DistributedCache.addCacheFile(new URI("/path/to/file.txt#file1", conf);