为什么hadoop无法识别我的Map类?

时间:2013-12-26 07:44:22

标签: java hadoop mapreduce runtimeexception

我正在尝试在hadoop 2.2.0上运行我的PDFWordCount map-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个datanode的集群。

我的主要功能是:

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

它需要/in作为输出路径,并且在我的主函数中有job.setJarByClass(PDFWordCount.class);时给出错误,如上所示。

我使用main函数运行简单的WordCount项目,并且运行它,我使用yarn jar wc.jar MyWordCount /in2 /out2并且运行完美。

我无法理解这是什么问题!

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

怎么了?!

1 个答案:

答案 0 :(得分:3)

我找到了克服这个问题的方法,即使我无法理解实际上是什么问题。

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

  1. Extract required libraries into generated JAR
  2. Package required libraries into generated JAR
  3. 我不知道确切的区别是什么,或者它是不是很重要。我曾经选择第二个选项,但如果我选择第一个选项,我可以使用此命令运行我的工作:

    yarn jar pdf.jar /in /out