0

我正在使用分布式缓存。但是执行代码后缓存中没有文件。我已经提到了其他类似的问题,但答案并没有解决我的问题。

请在下面找到代码:

   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));

这给了空..

因此,在 mapper 中给出相同的东西也会给出 null 。请让我知道你的建议。

谢谢

4

4 回答 4

2

尝试 getCacheFiles() 而不是 getLocalCacheFiles()

于 2013-12-29T16:17:49.333 回答
1

我相信这(至少部分)是由于 Chris White 在这里写的:

创建 Job 对象后,您需要将 Configuration 对象拉回,因为 Job 会对其进行复制,并且在创建作业后配置 conf2 中的值不会对作业本身产生影响。试试这个:

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 的观点是不正确的。

于 2013-05-06T08:39:18.793 回答
0

分发时不要忘记本地链接名,最好使用相对路径:

URI是形式hdfs://host:port/absolute-path#local-link-name

阅读时:

  • 如果你不使用分布式缓存的可能性,你应该使用 HDFSFileSystem来访问hdfs://host:port/absolute-path
  • 如果使用分布式缓存,则必须使用标准 Java 文件实用程序来访问local-link-name
于 2013-05-06T15:26:24.613 回答
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());
    }
于 2013-12-03T16:39:09.967 回答