Servlet尝试运行Hadoop 2.2.0 MapReduce Job时出现异常

时间:2014-03-31 14:28:07

标签: java eclipse servlets hadoop wildfly

已解决(解决方案在评论中)

我在ubuntu 13.10和Eclipse Kepler v4.3上使用 Hadoop 2.2.0 (在伪分布式模式下)来开发我的Hadoop程序和动态Web项目(没有Maven)。

我的Hadoop jar项目名为" WorkTest.jar",当我从命令行运行作业时正常工作:" Hadoop jar WorkTest.jar"我正确地看到终端上的工作进度。

Hadoop项目包含四个要素:

  • DriverJob.java(配置并启动作业的类)
  • Mapper.java
  • Combiner.java
  • Reducer.java

现在我编写了一个新的动态Web项目,其中包含 ServletTest.java ,其中我输入了DriverJob类代码,另一个类(Mapper.java,Combiner.java,Reducer.java)是放在与servlet(主包)相同的包中。 WebContent / lib文件夹包含所有Hadoop jar必需的依赖项。

我已经在WildFly 8 Server上成功部署了我的应用程序,但是当我尝试运行mapreduce作业(作业配置成功运行并且我设法删除并在HDFS上写入文件夹)时,他继续失败并出现以下异常从Hadoop作业日志文件中可见:

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).

但WildFly上的WEB-INF / classes / deploy文件夹包含Mapper.class,Combiner.class和Reducer.class。

我也尝试在servlet中输入Mapper,Combiner和Reducer的类代码,但不能使用相同的错误......

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我认为您需要将.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类。你没有jar,所以分发正确类的方法就分崩离析了。