给定一个Hadoop集群,我有一份工作,我要处理大量文件,所有 worker 在执行其reduce阶段时都需要访问这些文件。

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

  • 惰性文件获取:文件被懒惰地复制到工作程序(仅当
    尝试将其缓存在本地)。
  • getLocalCacheFiles很奇怪:另一个明显相关的问题是
    DistributedCache接口(interface)。访问本地文件,似乎
    需要调用DistributedCache.getLocalCacheFiles(conf)。有没有
    通过名称仅请求某个文件的方法(例如:
    DistributedCache.getLocalFile(conf,fileName))

  • 可以使用DistributedCache吗?还有其他满足我要求的图书馆吗?

    谢谢!

    最佳答案

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

    您可以使用符号链接(symbolic link)为分布式缓存中的文件赋予友好名称,并且它们将出现在每个映射/化简任务的本地工作目录中(符号链接(symbolic link))。

    例如,使用通用选项解析器选项-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来分配友好的名称:
    DistributedCache.addCacheFile(new URI("/path/to/file.txt#file1", conf);
    

    08-17 04:04