【问题标题】:Why hadoop does not recognize my Map class?为什么 hadoop 无法识别我的 Map 类?
【发布时间】:2013-12-26 07:44:22
【问题描述】:

我正在尝试在 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 个数据节点。

我的主要功能是这样的:

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); 时给我错误,如上所示。

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

我不明白是什么问题!

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

怎么了?!

【问题讨论】:

  • 你的jar文件有没有MyMap的class文件(MyMap.class)?应该是在你的jar文件中PDFWordCount$MyMap.class。尝试手动检查。我不确定,但 maven 应该可以解决问题。
  • 我的 map 和 reduce 类与 main 方法在同一个文件中。
  • 你能打开jar "myjar.jar" 看看是否能找到 PDFWordCount$MyMap.class , PDFWordCount$MyReduce.class & PDFWordCount.class
  • 内部 PDFWordCount.MyMap 类定义的可见性是什么?它应该是公共静态的。还有你的hadoop classpath 或 $HADOOP_CLASSPATH 的价值是多少?
  • @jtravaglini 我应该在哪里寻找它?

标签: java hadoop mapreduce runtimeexception


【解决方案1】:

我找到了解决这个问题的方法,尽管我无法理解问题到底出在哪里。

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

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

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

yarn jar pdf.jar /in /out

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2019-09-02
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多