文件未存储在分布式缓存中

时间:2013-05-06 08:04:48

标签: hadoop distributed-cache

我正在使用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。请让我知道你的建议。

由于

4 个答案:

答案 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

阅读时:

  • 如果您不使用分布式缓存可能性,则应使用HDFS FileSystem访问hdfs://host:port/absolute-path
  • 如果您使用分布式缓存,则必须使用标准Java文件实用程序来访问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());
    }