解决了(解决方案在注释中)
我在ubuntu 13.10和Eclipse Kepler v4.3上使用 Hadoop 2.2.0 (伪分布式模式)来开发Hadoop程序和动态Web项目(无Maven)。
当我从命令行使用“Hadoop jar WorkTest.jar”运行作业时,名为“WorkTest.jar”的Hadoop jar项目可以正常工作,并且可以在终端上正确查看工作进度。
Hadoop项目包含四个元素:
现在,我用 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/