it-swarm.com.ru

Как отлаживать задания Hadoop MapReduce из Eclipse?

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

03.1228 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

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

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

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

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

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

  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);
      }
}
14
sangfroid

Внесите изменения в скрипт /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 "[email protected]"
else
  exec "$Java" $Java_HEAP_MAX $HADOOP_OPTS $CLASS "[email protected]"
fi
7
Jagdeep Singh

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

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

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

5
Kapil D

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

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

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

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

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

2
Mash

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

1
Jaime Garza

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

Например:

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

0
llewellyn falco

Добавление аргументов во внутреннюю Java-команду hadoop может быть выполнено через переменную HADOOP_OPTS env:

export HADOOP_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=5005,suspend=y"
0
Honza