Hadoop DistributedCache缓存没有绝对路径的文件



我正在迁移到YARN,DistributedCache的行为似乎发生了变化。

以前,我会将一些文件添加到缓存中,如下所示:

for (String file : args) {
   Path path = new Path(cache_root, file);
   URI uri = new URI(path.toUri().toString());
   DistributedCache.addCacheFile(uri, conf);
}

路径通常看起来像

/some/path/to/my/file.txt

它预先存在于HDFS中,并且最终会作为出现在DistributedCache中

/$DISTRO_CACHE/some/path/to/my/file.txt

我可以在我当前的工作目录中符号链接到它,并与DistributedCache.getLocalCacheFiles() 一起使用

对于YARN,这个文件似乎最终在缓存中显示为:

/$DISTRO_CACHE/file.txt

即,文件URI的"路径"部分被删除,只剩下文件名。

如何使用不同的绝对路径以相同的文件名结束?考虑以下情况:

DistributedCache.addCacheFile("some/path/to/file.txt", conf);
DistributedCache.addCacheFile("some/other/path/to/file.txt", conf);

可以说有人可以使用碎片:

DistributedCache.addCacheFile("some/path/to/file.txt#file1", conf);
DistributedCache.addCacheFile("some/other/path/to/file.txt#file2", conf);

但这似乎不必要地更难管理。想象一下,如果这些是命令行参数,您需要以某种方式管理这两个文件名,尽管不同的绝对路径在DistributedCache中肯定会发生冲突,因此需要将这些文件名重新映射到片段,并以此方式传播到程序的其余部分?

有没有更简单的方法来管理它?

尝试将文件添加到Job

这很可能是您如何实际配置作业,然后在映射器中访问它们。

当你准备工作时,你会做一些类似的事情

    job.addCacheFile(new Path("cache/file1.txt").toUri());
    job.addCacheFile(new Path("cache/file2.txt").toUri());

然后在你的映射程序代码中,url将被存储在一个数组中,可以像这样访问

    URI file1Uri = context.getCacheFiles()[0];
    URI file2Uri = context.getCacheFiles()[1];

希望这能对你有所帮助。

相关内容

  • 没有找到相关文章

最新更新