我正在迁移到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中发生冲突,因此需要将这些文件名重新映射到片段并传播到其余部分该计划?
有没有更简单的方法来管理它?
答案 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];
希望这可以帮到你。