Изключение, когато Servlet се опитва да изпълни Hadoop 2.2.0 MapReduce Job

РЕШЕНО (решението е в коментарите)

Използвам Hadoop 2.2.0 (в псевдо-разпространен режим) на ubuntu 13.10 и Eclipse Kepler v4.3, за да разработя моята програма Hadoop и Dynamic Web Project (без Maven ).

Моят проект Hadoop jar, наречен "WorkTest.jar", работи правилно, когато стартирам задание от командния ред с: "Hadoop jar WorkTest.jar" и виждам правилно напредъка на работата на терминала.

Проектът Hadoop съдържа четири елемента:

  • DriverJob.java (клас, който конфигурира и стартира заданието)
  • Mapper.java
  • Combiner.java
  • Редуктор.java

Сега написах нов динамичен уеб проект с ServletTest.java, в който въведох кода на класа DriverJob, другият клас (Mapper.java, Combiner.java, Reducer.java) се поставят в същия пакет като сървлета (основен пакет). Папката WebContent/lib съдържа всички необходими зависимости на Hadoop jar.

Успешно разположих приложението си на WildFly 8 Server с Eclipse, но когато се опитам да стартирам mapreduce задание (конфигурацията на заданието се изпълнява успешно и успях да изтрия и запиша папка на HDFS), той продължава да се проваля със следното изключение, видимо от Регистрационен файл на Hadoop Job:

FATAL [IPC Server handler 5 on 46834] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Task: attempt_1396015900746_0023_m_000002_0 - exited : java.lang.RuntimeException: java.lang.ClassNotFoundException: Class Mapper not found
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1720)
    at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:186)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:721)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:339)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:162)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:157)
Caused by: java.lang.ClassNotFoundException: Class Mapper not found
    at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1626)
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1718)
    ... 8 more

и от регистрационния файл на WildFly:

WARN  [org.apache.hadoop.mapreduce.JobSubmitter] Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
WARN  [org.apache.hadoop.mapreduce.JobSubmitter] No job jar file set.  User classes may not be found. See Job or Job#setJar(String).

Но папката WEB-INF/classes/ deploy на WildFly, съдържаща Mapper.class, Combiner.class и Reducer.class.

Също така се опитах да въведа кода на класа на Mapper, Combiner и Reducer вътре в сервлета, но не работи със същата грешка...

Какво правя грешно?


person Andrea    schedule 31.03.2014    source източник


Отговори (1)


Вярвам, че трябва да имате вашите .class файлове в архив (jar), който може да бъде разпространен до възлите в клъстера.

WARN  [org.apache.hadoop.mapreduce.JobSubmitter] No job jar file set.  User classes may not be found. See Job or Job#setJar(String).

Тази грешка е ключът. Обикновено бихте използвали job.setJarByClass(DriverJob.class), за да кажете на клиента mapreduce кой jar файл има класовете Mapper/Reducer. Нямате буркан и този метод за разпределяне на правилните класове се разпада.

person Mike Park    schedule 31.03.2014
comment
Благодаря за отговора. Промених подхода си: премахнах кода на DriverJob от моя ServletTest и поставих Hadoop jar (WorkTest.jar) в папката WEB-INF/lib. В моя DriverJob.java съм задал: job.setJarByClass(jobexecutor.DriverJob.class); job.setMapperClass(jobexecutor.Mapper.class); job.setCombinerClass(jobexecutor.Combiner.class); job.setReducerClass(jobexecutor.Reducer.class); Сега извиквам само метода DriverJob String output = jobexecutor.DriverJob.run(String inputData) от сървлета; но когато се опитвам да стартирам mapreduce задача, той продължава да се проваля със същото изключение... - person Andrea; 02.04.2014
comment
Може да съм открил причината за проблема: ако вътре в моя клас DriverJob стартирам метода job.getJar();, това ми връща null стойност! Защо? - person Andrea; 02.04.2014
comment
И класовете за преобразуване/редуциране са в това WorkTest.jar? - person Mike Park; 02.04.2014
comment
Също така се уверете, че няма никакви забавени екземпляри на този клас файл някъде във вашия класов път - person Mike Park; 02.04.2014
comment
Да, класовете за преобразуване/редуциране са в WorkTest.jar. Успях да разреша проблема, като използвах config.set("mapreduce.job.jar", "full_path_of_my_jobexecutor.jar_in_my_deploy_folder_on_wildfly"); в рамките на DriverJob.java. Проблемът беше, че методът job.setJarByClass(jobexecutor.DriverJob.class) не успя да намери пакета, в който се съдържа... Наложих декларацията и грешката изчезна! - person Andrea; 03.04.2014