2013-05-06 54 views
0

我正在使用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)); 

这给了空..里面映射给时

同样的事情也给了空,因此。请让我知道你的建议。

感谢

+0

HDFS文件是否存在?此外,getLocalCacheFiles的最终调用在您的驱动程序代码中不起作用(但对于您的映射器 - 我假设您仅以此行为例)。在作业追踪器的Web UI中找到你的工作job.xml,并回传'mapred.cache.files'的值 – 2013-05-06 10:28:24

+0

感谢getLocalCacheFiles在驱动程序中不起作用的信息,我只是试图测试。但是在map类中,它也给出了空值。现在我只是发现它可以很好地使用DistributedCache.getCacheFiles(conf)。 这是否意味着我可以使用getCacheFiles(conf)而不是getLocalCacheFiles(conf)? 你能告诉我两者之间的区别吗? – 2013-05-07 09:48:33

+0

你可能想尝试-files选项,这是非常简单的。见我的答案在这里:http://stackoverflow.com/questions/16251788/distributed-caching-in-hadoop-file-not-found-exception/16271657#16271657 – 2013-05-06 10:50:12

回答

2

试getCacheFiles()代替getLocalCacheFiles()

+0

你有我的+1,但你能解释两者之间的区别吗? – Marko 2015-05-12 10:43:04

+0

这并不能解决问题。分布式缓存的要点是创建本地副本。 getCacheFiles()返回原始文件的hdfs路径。 Downvoted – frugalcoder 2017-05-08 08:51:23

1

我相信这是(至少部分地)由于什么克里斯·怀特写道here:您创建工作对象后

,需要拉回 配置对象作业创建它的副本,并在创建作业后在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); 

我想,如果它仍不能正常工作,是在某个地方的另一个问题,但这并不意味着克里斯·怀特的观点是不正确的。

+0

是的..我已经经历了这些答案。我不是说答案不正确。即使尝试了这些东西,我仍然面临着这个问题。因此,请求你帮助在那里有任何其他意见关于DistributedCache错过了 – 2013-05-06 09:20:01

0

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

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

的读取时:

  • 如果你不使用分布式缓存的可能性,你应该使用HDFS的FileSystem来访问hdfs://host:port/absolute-path
  • 如果使用分布式缓存,那么你必须使用标准的Java文件工具访问local-link-name
0

缓存文件需要在Hadoop的文件系统。你可以这样做: 无效copyFileToHDFS(JobConf jobConf,从字符串,字符串){

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