Hadoop DistributedCache classpath

У меня есть кластер Hadoop 0.20.2.

Я подумываю об использовании DistributedCache для распространения кода задания по всем узлам. Я не могу понять разницу между addFileToClassPath() а также addArchiveToClassPath(), Логически может показаться, что первый предназначен для файлов одного класса, а второй - для jar-файлов. Но прямо в javadocs у них есть этот пример кода:

DistributedCache.addFileToClassPath(new Path("/myapp/mylib.jar"), job);

3 ответа

Этот вопрос может быть полезным

как один из пользователей, упомянутых в разделе комментариев, есть ошибка, связанная с addArchiveToClassPath(), Лучший способ узнать и решить эту проблему - обновить Hadoop до версии 1.0.0.

С веб-сайта Apache:

addArchiveToClassPath Добавьте путь к архиву к текущему набору записей пути к классам. Он также добавляет архив в кеш. Архивные файлы будут распакованы и добавлены в путь к классам при распространении.

addFileToClassPath Добавить путь к файлу к текущему набору записей пути к классам. Он также добавляет файл в кеш. Файлы, добавленные этим методом , не будут распакованы при добавлении в путь к классам. Чтобы добавить архивы в classpath, используйте метод addArchiveToClassPath(Path).

Я понял, что документ Hadoop написан кем-то, кто не очень хорошо знает грамматику английского языка. Я понимаю, почему вы расстроены.

Позже я нашел дополнительную информацию и посмотрел на источник, чтобы обнаружить, что метод "Файл" копирует один локальный файл в один файл HDFS, но версия "Архив" распаковывает сжатый локальный архив в HDFS. В этом разница.

На связанной ноте, чтобы ответить на вопрос "зачем?" комментарии - у меня относительно большой JAR-файл (20 МБ) и задание, которое будет последовательно выполнять около 20 заданий M/R с использованием одного и того же кода. Это итеративно. Это сохранит нетривиальный объем передачи данных, чтобы загрузить код один раз.

Обновление Hadoop не всегда выполнимо - как кто-то предположил, в этом случае имеет смысл просто упаковать этот jar в jar для работы MR, даже большой JAR вряд ли сильно повлияет на производительность.

Кроме того, если jar содержит код для задания, которое вы отправляете, нет необходимости добавлять его в DistributedCache, отправка задания в hadoop означает, что исполнитель заданий Hadoop позаботится о распределении вашего jar по всем узлам, которые бегущие мапперы или редукторы. Добавление файлов в DistributedCache необходимо только в том случае, если вы хотите, чтобы некоторые внешние данные сопровождали вашу работу.

Другие вопросы по тегам