Hadoop DistributedCache - FileNotFound
Я пытаюсь поместить файл в распределенный кеш. Для этого я вызываю свой класс драйвера, используя опцию -files, что-то вроде:
hadoop jar job.jar my.driver.class -files MYFILE input output
getCacheFiles()
и getLocalCacheFiles()
возвращать массивы URI / путей, содержащих MYFILE.
(Например: hdfs://localhost/tmp/hadoopuser/mapred/staging/knappy/.staging/job_201208262359_0005/files/histfile#histfile)
К сожалению, при попытке получить MYFILE в задаче карты он выдает FileNotFoundException
,
Я пробовал это в автономном (локальном) режиме, а также в псевдораспределенном режиме.
Вы знаете, в чем может быть причина?
ОБНОВИТЬ:
Следующие три строки:
System.out.println("cache files:"+ctx.getConfiguration().get("mapred.cache.files"));
uris = DistributedCache.getLocalCacheFiles(ctx.getConfiguration());
for(Path uri: uris){
System.out.println(uri.toString());
System.out.println(uri.getName());
if(uri.getName().contains(Constants.PATH_TO_HISTFILE)){
histfileName = uri.getName();
}
}
распечатайте это:
cache files:file:/home/knappy/histfile#histfile
/tmp/hadoop-knappy/mapred/local/archive/-7231_-1351_105/file/home/knappy/histfile
histfile
Итак, файл, кажется, указан в job.xml mapred.cache.files
свойство и локальный файл, кажется, присутствует. Тем не менее, FileNotFoundException выбрасывается.
1 ответ
Первая проверка mapred.cache.files
в xml вашей работы, чтобы увидеть, находится ли файл в кеше. Вы можете получить его в вашем картографе:
...
Path[] files = DistributedCache.getLocalCacheFiles(context.getConfiguration());
File myFile = new File(files[0].getName());
//read your file content
...