我正在使用DistributedCache。但是执行代码后缓存中没有文件。 我已经提到了其他类似的问题,但答案并没有解决我的问题。
请找到以下代码:
Configuration conf = new Configuration();
Job job1 = new Job(conf, "distributed cache");
Configuration conf1 = job1.getConfiguration();
DistributedCache.addCacheFile(new Path("File").toUri(), conf1);
System.out.println("distributed cache file "+DistributedCache.getLocalCacheFiles(conf1));
这给出了null ..
在mapper中给出同样的东西也会给出null。请让我知道你的建议。
由于
答案 0 :(得分:2)
尝试getCacheFiles()而不是getLocalCacheFiles()
答案 1 :(得分:1)
我相信这是(至少部分)由于Chris White写的here:
创建Job对象后,需要撤回 作为Job的配置对象会复制它并配置值 在创建作业后的conf2中,对作业没有任何影响 iteself。试试这个:
job = new Job(new Configuration()); Configuration conf2 = job.getConfiguration(); job.setJobName("Join with Cache"); DistributedCache.addCacheFile(new URI("hdfs://server:port/FilePath/part-r-00000"), conf2);
我想如果它仍然不起作用,某处还有另一个问题,但这并不意味着Chris White的观点不正确。
答案 2 :(得分:0)
分发时,请不要忘记本地链接名称,最好使用相对路径:
URI
的格式为hdfs://host:port/absolute-path#local-link-name
阅读时:
FileSystem
访问hdfs://host:port/absolute-path
local-link-name
答案 3 :(得分:0)
缓存文件需要位于Hadoop文件系统中。你可以这样做: void copyFileToHDFS(JobConf jobConf,String from,String to){
try {
FileSystem aFS = FileSystem.get(jobConf);
aFS.copyFromLocalFile(false, true, new Path(
from), new Path(to));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
复制文件后,您可以将它们添加到缓存中,如下所示:
void fillCache(JobConf jobConf){
Job job;
copyFileToHDFS(jobConf, fromLocation, toLocation);
job = Job.getInstance(jobConf);
job.addCacheFile(new URI(toLocation));
JobConf newJobConf = new JobConf(job.getConfiguration());
}