Распределенный кеш Hadoop — 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.


person Razvan    schedule 28.08.2012    source источник


Ответы (1)


Сначала проверьте mapred.cache.files в XML-файле вашего задания, чтобы узнать, находится ли файл в кеше. Вы можете получить его в своем картографе:

...
Path[] files = DistributedCache.getLocalCacheFiles(context.getConfiguration());
File myFile = new File(files[0].getName());
//read your file content
...
person Lorand Bendig    schedule 28.08.2012
comment
не могли бы вы взглянуть на обновление? Все равно не находит файл - person Razvan; 29.08.2012
comment
как вы извлекаете свой файл из URI/путей? - person Lorand Bendig; 30.08.2012
comment
да, я решил проблему. Я пытался получить его из uri, используя экземпляр FS, созданный с использованием этого uri. Я должен был попытаться получить локально, что я в конце концов и сделал, и теперь это работает. Спасибо! - person Razvan; 30.08.2012