hadoop懒惰分布式缓存



给定一个hadoop集群,我有一个作业,其中有一大组文件需要所有工作人员在执行reduce阶段时访问。

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

  • 惰性文件获取:文件被惰性地复制到工作者(仅当试图被读取的数据是否被本地缓存)。

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

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

谢谢!

分布式缓存不支持延迟加载,它们会在作业的第一个map/reduce任务在每个任务节点上执行之前向下复制到该节点(请注意,文件只复制到将要执行map/reduze任务的节点)。如果你想延迟加载,只需直接在HDFS中打开文件,尽管如果你有1000个并发任务试图从同一文件中读取,这对你的namenode/datanodes来说不是很好

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

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

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

现在,您应该能够打开ref-map.txt文件,只需在映射/还原器中调用以下内容:

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

如果您的文件已经在HDFS中,那么只需像往常一样添加then,并调用createSymlink(Configuration)方法。当您将文件添加到分布式缓存时,您也可以使用片段URI来分配友好的nanes:

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

相关内容

  • 没有找到相关文章

最新更新