2012-03-28 2 views
14

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

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 

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

Так что, в принципе, если я хочу, чтобы переключался между «режимом отладки» и «нормальным режимом», мне нужно обновить hadoop-env.sh и перезагрузить машину. Большая боль. Поэтому у меня есть несколько вопросов:

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

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

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

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

  5. Это более общий вопрос: что именно происходит, когда я запускаю 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); 
     } 
} 
+3

В качестве В противном случае, если вы просто пытаетесь отладить логику карты/редуктора, вы должны изучить использование MRUnit (http://www.cloudera.com/blog/2009/07/debugging-mapreduce-programs-with-mrunit/) –

+0

Как @Chris White предлагает начать с MRUnit, чтобы проверить Map/Reduce logic - хорошая идея: http://incubator.apache.org/projects/mrunit.html –

ответ

1

Кроме рекомендуемого MRUnit мне нравится отлаживать с затмением, а также. У меня есть основная программа. Он создает конфигурацию и выполняет работу MapReduce напрямую. Я просто отлаживаю стандартную конфигурацию отладки eclipse. Так как я включаю баночки в моей спецификации mvn, у меня есть все хаоп как таковой в моем классе, и мне не нужно запускать его против моего установленного хауопа. Я всегда проверяю с небольшими наборами данных в локальных каталогах, чтобы упростить задачу.Настройки по умолчанию для конфигурации ведут себя как автономный хаоп (имеется файловая система)

+0

Спасибо за ваш ответ. У меня тоже есть hasoop-core, настроенный как зависимость в моем POM. Так как это так, почему я получаю ошибку «No jar file set set»? Это потому, что я звоню job.setJarByClass()?Не могли бы вы разместить несколько примеров кода? – sangfroid

5

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

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

Эти могут помочь · блоги, ·:

+0

Привет @Kapil, то, что вы описали, возможно в Hadoop 2.4 (с пряжей и т. Д.). Я пытаюсь запустить локальное задание в eclipse с новой версией и смотреть на 'Can not initialize Cluster. Проверьте свою конфигурацию ... ' –

+0

@PedroDusso У вас есть локальная отладка для работы с Hadoop 2.4+? – erichfw

+0

@erichfw Я никогда не пробовал ... Я использовал 2,2 времени, когда задавал этот вопрос. –

0

Я также хотел отлаживать с помощью модульного тестирования ж/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

Вносить изменения в /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 
+0

Я не пробовал точно это, но я заменил $ JAVA на jdb (я пытался отлаживать использование jdb). jdb никогда не узнал точку останова, которую я пытался разместить там, где я хотел, чтобы программа остановилась. Я предполагаю, что проблема в том, что я не работал в локальном режиме. Я еще не пробовал, но я предполагаю, что предложение Капиля D - это то, что мне нужно. –

+4

Вы можете alos добавить параметры отладки в $ HADOOP_OPTS оболочки вашей оболочки и не изменять скрипт hadoop. export HADOOP_OPTS = "$ HADOOP_OPTS -Xdebug -Xrunjdwp: transport = dt_socket, server = y, address = 8999" –

2

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

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

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

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

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

Смежные вопросы