java - Servlet尝试运行Hadoop 2.2.0 MapReduce作业时发生异常

标签 java eclipse servlets hadoop wildfly

解决了(解决方案在注释中)

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

当我从命令行使用“Hadoop jar WorkTest.jar”运行作业时,名为“WorkTest.jar”的Hadoop jar项目可以正常工作,并且可以在终端上正确查看工作进度。

Hadoop项目包含四个元素:

  • DriverJob.java(配置和启 Action 业的类)
  • Mapper.java
  • Combiner.java
  • Reducer.java

  • 现在,我用 ServletTest.java 编写了一个新的Dynamic Web Project,在其中输入了DriverJob类代码,另一个类(Mapper.java,Combiner.java,Reducer.java)放置在与Servlet相同的程序包中。 (主包装)。 WebContent / lib文件夹包含所有Hadoop jar必需的依赖项。

    我已经在Eclipse上的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的类代码,但无法使用相同的错误...

    我做错了什么?

    最佳答案

    我相信您需要将.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,因此用于分配适当类的方法会崩溃。

    关于java - Servlet尝试运行Hadoop 2.2.0 MapReduce作业时发生异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22764262/

    相关文章:

    java - 如何使用 WindowBuilder 在 Eclipse Mars 中调整 Tab 键顺序

    java - 在eclipse中读取文件

    eclipse - 如何在 BIRT 中通过 URL 传递输入参数?

    java - Servlet参数加密

    java - Spring Boot中未创建MongoDB唯一索引

    java - 无法执行 jar 文件 : "no main manifest attribute"

    Java 数组游戏商店

    java - TopCoder 使用离线可视化工具进行割草挑战

    java - 使用浏览器手动删除 cookie 后的请求

    java - 在 servlet 和 java 文件之间传递值