为什么hadoop不能识别我的Map类



我正试图在hadoop 2.2.0上运行我的PDFWordCount映射reduce程序,但我得到了这个错误:

13/12/25 23:37:26 INFO mapreduce.Job: Task Id : attempt_1388041362368_0003_m_000009_2, Status : FAILED
Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class PDFWordCount$MyMap 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 PDFWordCount$MyMap not found
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1626)
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1718)
... 8 more

上面说我的地图课是未知的。我有一个集群,在3个虚拟机上有一个namenod和2个数据节点。

我的主要功能是:

public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
@SuppressWarnings("deprecation")
Job job = new Job(conf, "wordcount");
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapperClass(MyMap.class);
job.setReducerClass(MyReduce.class);
job.setInputFormatClass(PDFInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setJarByClass(PDFWordCount.class);
job.waitForCompletion(true);
}

如果我使用以下命令运行我的jar:

yarn jar myjar.jar PDFWordCount /in /out

它将CCD_ 1作为输出路径,并在我的主函数中有CCD_。

我运行了一个简单的WordCount项目,它的主函数和这个主函数完全一样,为了运行它,我使用了yarn jar wc.jar MyWordCount /in2 /out2,它运行得很完美。

我不明白问题出在哪里!

更新:我试图将我的工作从这个项目转移到我成功使用的wordcount项目。我构建了一个包,将相关文件从pdfwordcount项目复制到这个包中,并导出了这个项目(我的main没有改为使用PDFInputFormat,所以我除了将java文件移动到新包之外什么都没做。)它不起作用。我删除了其他项目中的文件,但没有成功。我将java文件移回默认包,但它不起作用!

怎么了

我找到了一种克服这个问题的方法,尽管我不明白实际问题是什么。

当我想在eclipse中将我的java项目导出为jar文件时,我有两个选项:

  1. Extract required libraries into generated JAR
  2. Package required libraries into generated JAR

我不知道到底有什么区别,也不知道这有什么大不了的。我曾经选择第二个选项,但如果我选择第一个选项,我可以使用以下命令运行我的作业:

yarn jar pdf.jar /in /out

最新更新