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

时间:2015-03-17 05:49:07

标签: apache hadoop mapreduce yarn distributed-caching

我正在迁移到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中发生冲突,因此需要将这些文件名重新映射到片段并传播到其余部分该计划?

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

1 个答案:

答案 0 :(得分:0)

尝试将文件添加到作业

您最有可能实际配置作业,然后在Mapper中访问它们。

当您正在设置工作时,您将会执行类似

的操作
    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];

希望这可以帮到你。