Как отлаживать hasoop mapreduce jobs из eclipse?
Я запускаю hasoop в одиночной машине, только для локальных настроек, и я ищу хороший, безболезненный способ отладки карт и редукторов в eclipse. У Eclipse нет проблем с выполнением задач mapreduce. Однако, когда я иду на отладку, он дает мне эту ошибку:
12/03/28 14:03:23 WARN mapred.JobClient: не задан файл jar файла. Пользовательские классы не могут быть найдены. См. JobConf (класс) или JobConf # setJar (String).
Хорошо, поэтому я занимаюсь некоторыми исследованиями. По-видимому, я должен использовать средство удаленной отладки eclipse и добавить его в мой hadoop-env.sh
:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5000
Я делаю это, и я могу пройти через свой код в eclipse. Единственная проблема заключается в том, что из-за "suspend = y" я не могу использовать команду "hadoop" из командной строки, чтобы делать такие вещи, как смотреть на очередь заданий; он зависает, я представляю, потому что он ждет отладчика, который будет прикрепляться. Кроме того, я не могу запустить "hbase shell", когда я в этом режиме, возможно, по той же причине.
В принципе, если я хочу перевернуть назад и вперед между "режимом отладки" и "нормальным режимом" , мне нужно обновить hadoop-env.sh
и перезагрузить компьютер. Большая боль. Поэтому у меня есть несколько вопросов:
-
Есть ли более простой способ выполнения отладки mapreduce заданий в eclipse?
-
Как получилось, что eclipse может выполнять мои задания mapreduce просто отлично, но для отладки мне нужно использовать удаленную отладку?
-
Есть ли способ сказать hadoop использовать удаленную отладку для заданий mapreduce, но работать в нормальном режиме для всех других задач? (например, "queue queue" или "hbase shell" ).
-
Есть ли более простой способ переключения конфигураций hadoop-env.sh
без перезагрузки моей машины? По умолчанию hasoop-env.sh не исполняется.
-
Это более общий вопрос: что именно происходит, когда я запускаю hadoop в локальном режиме? Существуют ли какие-либо процессы на моей машине, которые "всегда включены" и выполняются рабочие задания? Или hasoop только делает что-то, когда я запускаю команду "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);
}
}
Ответы
Ответ 1
Внесите изменения в /bin/hadoop
(hadoop-env.sh
) script. Проверьте, какая команда была запущена. Если команда 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
Ответ 2
Единственный способ отладки hadoop в eclipse - использовать hasoop в локальном режиме. Причина в том, что каждая карта уменьшает выполнение задачи в собственной JVM и когда вы не используете в локальном режиме, eclipse не сможет отлаживать.
Когда вы устанавливаете hasoop в локальный режим, вместо использования hdfs API (который по умолчанию) файловая система hasoop изменяется на file:///
. Таким образом, запуск hadoop fs -ls
не будет командой hdfs, но больше hadoop fs -ls file:///
, путь к вашему локальному каталогу. Ни один из JobTracker или NameNode не запускается.
Эти blogpost могут помочь:
Ответ 3
Jumbune debugger сделает все это с минимальными усилиями.
Отладчик предоставляет статистику потока управления уровнем кода задания MapReduce.
Пользователь может применять проверки регулярных выражений или собственные классы проверки. В соответствии с применяемыми проверками Flow Debugger проверяет поток данных для картографа и редуктора соответственно.
Он также предоставляет подробное представление таблицы/диаграммы, где поток входных записей отображается на уровне задания, уровне MR и уровне экземпляра.
Непревзойденные ключи/значения представляют количество ошибочных данных ключа/значения в результате выполнения задания. Отладчик сверлит вниз код, чтобы проверить поток данных для разных счетчиков, таких как циклы и условия, если, else-if и т.д.
Jumbune является открытым исходным кодом и доступен на www.jumbune.org и https://github.com/impetus-opensource/jumbune
Ответ 4
Кроме рекомендованного MRUnit, мне нравится отлаживать и eclipse. У меня есть основная программа. Он создает конфигурацию и выполняет работу MapReduce напрямую. Я просто отлаживаю стандартную конфигурацию отладки eclipse. Так как я включаю баночки в моей спецификации mvn, у меня есть все хаоп как таковой в моем классе, и мне не нужно запускать его против моего установленного хауопа. Я всегда проверяю с небольшими наборами данных в локальных каталогах, чтобы упростить задачу. Настройки по умолчанию для конфигурации ведут себя как автономный хаоп (доступна файловая система)
Ответ 5
Мне также нравится отлаживать через unit test w/MRUnit. Я буду использовать это в сочетании с утверждениями, которые создают легкую визуализацию процесса "Уменьшение карты" и облегчают переход в сценарии, которые не работают. Он также отлично работает от затмения.
Например:
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
Ответ 6
Добавление аргументов во внутреннюю java-команду hadoop можно выполнить с помощью переменной env HADOOP_OPTS:
export HADOOP_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=5005,suspend=y"