Было несколько связанных вопросов, но я потратил весь день, пытаясь понять это, и ответ был нигде в 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
- что может помочь в некоторых случаях, но мне не ясно, к чему вы ее настроили, и в моем предыдущем рабочем примере мне все равно не приходилось это делать, чтобы это казалось маловероятным.
Совершенно таинственный!