Исключительная ситуация при попытке запустить задание mapreduce из Java-приложения - PullRequest
0 голосов
/ 21 января 2012

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

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

Если я не установлю conf's mapred.job.jobtracker, он будет работать вечно. Задача карты поворачивается на 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

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

Ответы [ 3 ]

1 голос
/ 28 марта 2012

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

Как сделать монолитный jar.file?

затем беги с баночкой из-под коня.

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

1 голос
/ 30 марта 2012

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

1 голос
/ 27 марта 2012

Поскольку вы используете Maven, я настоятельно рекомендую запекать ваши зависимости статически в ваш JAR .

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

...