2013-04-23 3 views
0

Было несколько связанных вопросов, но я потратил весь день, пытаясь понять это, и ответ был нигде в SO, поэтому я записываю его для потомков.Hadoop Map Сокращение распределенных кеш-маршрутов по классам

У меня есть установка Hadoop (CDH 3u6 - Hadoop 0.20.2), в которой я хотел отправить работу по сокращению карты, которая имела несколько зависимостей Jar. Как и большинство рекомендуемых мест, я хотел использовать распределенный кеш для отправки зависимостей узлам данных.

Path someHdfsPlace = new Path("my/mr/libs"); 
FileStatus[] jarFiles = hdfs.listStatus(classpathFilesDir); 
for (FileStatus fs : jarFiles) { 
     DistributedCache.addFileToClassPath(fs.getPath(), job.getConfiguration()); 
} 

Я видел эту работу на другом кластере Hadoop, и теперь внезапно этого не произошло. Файл существовал в hdfs, и, казалось, были правильные разрешения на файлы и каталоги над ним, но любой MR-код сработал, как только он попытался загрузить зависимость из lib с ошибкой ClassNotFound (так что проблема с коррупцией, просто эти вещи не присутствовали на пути к классу.)

В одном посте предлагается указать переменную $HADOOP_CLASSPATH - что может помочь в некоторых случаях, но мне не ясно, к чему вы ее настроили, и в моем предыдущем рабочем примере мне все равно не приходилось это делать, чтобы это казалось маловероятным.

Совершенно таинственный!

ответ

0

Для меня, по крайней мере, ответ в этом сообщении об ошибке:

https://issues.apache.org/jira/browse/MAPREDUCE-1581

Путь может быть встретив как полный путь: hdfs://host:2456/my/mr/libs/myJar.jar, которые в некоторых средах, где : является путь разделитель, приведет к набору файлов, //host и 2456/my/mr/libs/myJar.jar, ни один из которых не приведет к добавлению правого файла в путь класса.

2-й раствор размещен в сообщении об ошибке работал для меня - дисквалифицировать путь так:

Path someHdfsPlace = new Path("my/mr/libs"); 
FileStatus[] jarFiles = hdfs.listStatus(classpathFilesDir); 
for (FileStatus fs : jarFiles) { 
     Path disqualified = new Path(fs.getPath().toUri().getPath()); 
     DistributedCache.addFileToClassPath(disqualified, job.getConfiguration()); 
} 
Смежные вопросы