Как отлаживать задания Hadoop MapReduce из Eclipse? - PullRequest
14 голосов
/ 29 марта 2012

Я использую hadoop на одной машине, локально, и я ищу хороший, безболезненный способ отладки картографов и редукторов в Eclipse. Eclipse не имеет проблем при выполнении задач mapreduce. Однако, когда я иду к отладке, это дает мне эту ошибку:

12/03/28 14:03:23 WARN mapred.JobClient: Не задан файл JAR задания. Пользовательские классы могут быть не найдены. См. JobConf (Класс) или JobConf # setJar (Строка).

Хорошо, я проведу небольшое исследование. По-видимому, я должен использовать средство удаленной отладки eclipse и добавить это к моему hadoop-env.sh:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5000

Я делаю это и могу пройти по своему коду в затмении. Единственная проблема заключается в том, что из-за «suspend = y» я не могу использовать команду «hadoop» из командной строки для таких вещей, как просмотр очереди заданий; он зависает, я представляю, потому что он ждет отладчика для подключения. Кроме того, я не могу запустить "hbase shell", когда я в этом режиме, возможно, по той же причине.

Так что, в принципе, если я хочу переключаться между "режимом отладки" и "нормальным режимом" , мне нужно обновить hadoop-env.sh и перезагрузить компьютер. Сильная боль. Итак, у меня есть несколько вопросов:

  1. Есть ли более простой способ отладки заданий mapreduce в eclipse?

  2. Почему eclipse может нормально выполнять мои задания mapreduce, но для отладки мне нужно использовать удаленную отладку?

  3. Есть ли способ указать hadoop использовать удаленную отладку для заданий mapreduce, но работать в обычном режиме для всех других задач? (например, "очередь очереди" или "оболочка hbase" ).

  4. Существует ли более простой способ переключения hadoop-env.sh конфигураций без перезагрузки компьютера? По умолчанию hadoop-env.sh не является исполняемым.

  5. Это более общий вопрос: что именно происходит, когда я запускаю hadoop в локальном режиме? Есть ли на моей машине процессы, которые "всегда включены" и выполняют задания hadoop? Или hadoop работает только тогда, когда я запускаю команду hadoop из командной строки? Что делает eclipse, когда я запускаю задание mapreduce из eclipse? Я должен был ссылаться на hadoop-core в моем pom.xml, чтобы заставить мой проект работать. Eclipse отправляет задания на мой установленный экземпляр hadoop, или он как-то запускает все это из hadoop-core-1.0.0.jar в моем кэше maven?

Вот мой главный класс:

public class Main {
      public static void main(String[] args) throws Exception {     
        Job job = new Job();
        job.setJarByClass(Main.class);
        job.setJobName("FirstStage");

        FileInputFormat.addInputPath(job, new Path("/home/sangfroid/project/in"));
        FileOutputFormat.setOutputPath(job, new Path("/home/sangfroid/project/out"));

        job.setMapperClass(FirstStageMapper.class);
        job.setReducerClass(FirstStageReducer.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);

        System.exit(job.waitForCompletion(true) ? 0 : 1);
      }
}

Ответы [ 6 ]

7 голосов
/ 23 октября 2012

Внести изменения в скрипт /bin/hadoop (hadoop-env.sh). Проверьте, какая команда была запущена. Если команда jar, добавьте только конфигурацию удаленной отладки.

if [ "$COMMAND" = "jar" ] ; then
  exec "$JAVA" -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8999 $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
else
  exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
fi
5 голосов
/ 12 июня 2012

Единственный способ отладки hadoop в eclipse - это запуск hadoop в локальном режиме. Причина в том, что каждая карта сокращает количество задач, выполняемых в собственной JVM, и когда вы не выполняете цикл в локальном режиме, eclipse не сможет отлаживать.

Когда вы устанавливаете hadoop в локальный режим, вместо использования hdfs API (по умолчанию), файловая система hadoop меняется на file:///. Таким образом, запуск hadoop fs -ls будет не командой hdfs, а скорее hadoop fs -ls file:///, путем к вашему локальному каталогу. Ни один из JobTracker или NameNode не работает.

Эти посты могут помочь:

2 голосов
/ 25 августа 2014

Отладчик Jumbune сделает все это с минимальными усилиями.

Отладчик предоставляет статистику потока управления на уровне кода для задания MapReduce.

Пользователь может применять проверки регулярных выражений или свои собственные определенные пользователем классы проверки. В соответствии с применяемыми проверками Flow Debugger проверяет поток данных для картографа и редуктора соответственно.

Он также предоставляет исчерпывающее представление таблицы / диаграммы, где поток входных записей отображается на уровне задания, уровне MR и уровне экземпляра. Несоответствующие ключи / значения представляют количество ошибочных данных ключ / значение в результате выполнения задания. Отладчик углубляется в код для проверки потока данных для различных счетчиков, таких как циклы и условия if, else-if и т. Д.

Jumbune с открытым исходным кодом и доступен по адресу www.jumbune.org и https://github.com/impetus-opensource/jumbune

1 голос
/ 29 марта 2012

Помимо рекомендованного MRUnit, мне также нравится отлаживать с помощью eclipse.У меня есть основная программа.Он создает конфигурацию и выполняет задание MapReduce напрямую.Я просто отлаживаю со стандартными конфигурациями Eclipse Debug.Так как я включаю jar hadoop в мою спецификацию mvn, у меня есть все hadoop per se в моем пути к классам, и мне не нужно запускать его для моего установленного hadoop.Я всегда тестирую небольшие наборы данных в локальных каталогах, чтобы упростить задачу.Значения по умолчанию для конфигурации ведут себя как автономный hadoop (файловая система доступна)

0 голосов
/ 18 января 2019

Добавление аргументов к внутренней java-команде hadoop можно выполнить с помощью переменной env HADOOP_OPTS:

export HADOOP_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=5005,suspend=y"
0 голосов
/ 20 сентября 2012

Мне также нравится отлаживать с помощью модульного теста с MRUnit. Я буду использовать это в сочетании с проверками одобрения, которые упрощают визуализацию процесса Map Reduce и упрощают переход к сценариям, которые терпят неудачу. Он также работает без затмения.

Например:

HadoopApprovals.verifyMapReduce(new WordCountMapper(), 
                         new WordCountReducer(), 0, "cat cat dog");

Будет выводить:

[cat cat dog] 
-> maps via WordCountMapper to ->
(cat, 1) 
(cat, 1) 
(dog, 1)

-> reduces via WordCountReducer to ->
(cat, 2) 
(dog, 1)

Здесь есть видео о процессе: http://t.co/leExFVrf

...