已解决(解决方案在备注中)
我在ubuntu13.10和eclipsekeplerv4.3上使用hadoop2.2.0(伪分布式模式)来开发hadoop程序和动态web项目(没有maven)。
我的hadoopjar项目名为“worktest.jar”,当我从命令行运行带有“hadoopjar worktest.jar”的job时,它可以正常工作,并且我可以正确地看到终端上的工作进度。
hadoop项目包含四个元素:
java(配置和启动作业的类)
Map器.java
组合器.java
减速器.java
现在我用servlettest.java编写了一个新的动态web项目,在这个项目中我输入了driverjob类代码,另一个类(mapper.java、combiner.java、reducer.java)与servlet(主包)放在同一个包中。webcontent/lib文件夹包含所有hadoopjar必需的依赖项。
我已经成功地将我的应用程序部署在wildfly 8 server whit eclipse上,但是当我尝试运行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上的webinf/classes/deploy文件夹包含mapper.class、combiner.class和reducer.class。
我还尝试在servlet中输入mapper、combiner和reducer的类代码,但没有遇到相同的错误。。。
我做错了什么?
1条答案
按热度按时间nlejzf6q1#
我相信你需要
.class
归档(jar)中的文件,可以分发到集群中的节点。这个错误是关键。通常你会用
job.setJarByClass(DriverJob.class)
告诉mapreduce客户机哪个jar文件有mapper/reducer类。您没有jar,因此用于分发适当类的方法会崩溃。