我正在迁移到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];
希望这能对你有所帮助。