Я запускаю 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
и перезагрузить машину. Большая боль. Поэтому у меня есть несколько вопросов:
Есть ли более простой способ выполнять отладки mapreduce jobs в eclipse?
Почему eclipse может работать с моими заданиями mapreduce просто отлично, но для отладки мне нужно использовать удаленную отладку?
Есть ли способ сказать hadoop использовать удаленную отладку для задания mapreduce, но для работы в нормальном режиме для всех других задач? (например, «hadoop 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);
}
}
В качестве В противном случае, если вы просто пытаетесь отладить логику карты/редуктора, вы должны изучить использование MRUnit (http://www.cloudera.com/blog/2009/07/debugging-mapreduce-programs-with-mrunit/) –
Как @Chris White предлагает начать с MRUnit, чтобы проверить Map/Reduce logic - хорошая идея: http://incubator.apache.org/projects/mrunit.html –