【问题标题】:hadoop lazy distributedcachehadoop 惰性分布式缓存
【发布时间】:2013-09-01 05:28:11
【问题描述】:

给定一个 hadoop 集群,我有一个工作,我有一大组文件需要所有工作人员在他们执行缩减阶段时访问。

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

  • 延迟文件获取:文件被延迟复制到工作人员(仅当 尝试读取它们是否缓存在本地)。

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

分布式缓存可以做到这一点吗?还有其他满足我要求的库吗?

谢谢!

【问题讨论】:

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


    【解决方案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 中,那么只需像往常一样添加 then,然后调用 createSymlink(Configuration) 方法。当您将文件添加到分布式缓存时,您还可以使用片段 URI 分配友好的名称:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多