已解决(解决方案在评论中)
我在ubuntu 13.10和Eclipse Kepler v4.3上使用 Hadoop 2.2.0 (在伪分布式模式下)来开发我的Hadoop程序和动态Web项目(没有Maven)。
我的Hadoop jar项目名为" WorkTest.jar",当我从命令行运行作业时正常工作:" Hadoop jar WorkTest.jar"我正确地看到终端上的工作进度。
Hadoop项目包含四个要素:
现在我编写了一个新的动态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的类代码,但不能使用相同的错误......
我做错了什么?
答案 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,所以分发正确类的方法就分崩离析了。