2012-01-21 3 views
0

Мне нужно вызвать задание mapreduce из java-приложения. Я используюИсключение при попытке запустить задание mapreduce из java-приложения

ToolRunner.run(new Validation(), pathsMoveToFinal.toArray(new String[pathsMoveToFinal.size()])); 

Если я не установлю mapred.job.jobtracker Conf, он работает как всегда. Задача карты переходит на 100%, а затем возвращается к другому проценту. Если я устанавливаю mapred.job.jobtracker, он жалуется на класс картографа не может быть найден:

java.lang.RuntimeException: java.lang.ClassNotFoundException: utils.DataValidationExtractorMapper 
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:809) 
at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:157) 
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:569) 
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:305) 
at org.apache.hadoop.mapred.Child.main(Child.java:170) 
Caused by: java.lang.ClassNotFoundException: utils.DataValidationExtractorMapper 
at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:247) 
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:762) 
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:807) 
... 4 more 

Может кто-нибудь пожалуйста, дайте мне подсказку. Спасибо, у вас хорошие выходные.

+0

это проблема с classpath. Если вы используете eclipse, вам нужно добавить банки в путь к классам –

+0

Спасибо. У меня есть банки в моем классе. Когда я пытаюсь из окна eclipse, он может перейти к методу запуска Validation. Но после того, как я упакую его и запускаю из linux, он дает это исключение. У меня есть jar в папке lib. –

+0

Если вы не строите банку «все в одном», вам нужно исправить свой путь к классу. –

ответ

1

Совместимость. Это не из-за maven. Когда я пытаюсь начать работу с mapreduce из java-кода, мне нужно упаковать задание mapreduce в банке. Потому что hadoop пытался скопировать банку в разные задачи jvms. Спасибо за все предложение!

1

Поскольку вы используете Maven, я настоятельно рекомендую baking your dependencies statically into your JAR.

Причина, по которой это происходит, заключается в том, что у ваших карт и редукторов JRE нет уже существующего контекста пути к вашему клиенту. Выпечка в зависимостях надежна и стабильна, и Hadoop должен работать с этим JAR довольно счастливо.

1

Пожалуйста, смотрите мой предыдущий ответ (и другие ответы) здесь:

How to make a monolithic jar.file?

затем запустить с Hadoop баночке.

Установка пути к классам в общих/незанятых блоках может быть большой проблемой, поскольку файлы jar должны быть реплицированы на все серверы задач. Добавьте один сервер, забудьте установить путь к классам, ouch, моя работа ломается на какой-то машине задач, но работает в других. Попробуйте отладить, когда у вас есть 100 ящиков! Монолитные банки позволят вам инкапсулировать все ваши зависимости в одну большую раздаваемую банку.

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