Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么hadoop不能识别我的Map类?_Java_Hadoop_Mapreduce_Runtimeexception - Fatal编程技术网

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

Java 为什么hadoop不能识别我的Map类?,java,hadoop,mapreduce,runtimeexception,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$MyM

我试图在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
yarn jar pdf.jar /in /out
它将中的
/in作为输出路径,并在我有
作业.setJarByClass(PDFWordCount.class)时给我错误信息在我的主函数中,如上所示

我运行了简单的WordCount项目,其主要功能与此主要功能完全相同,为了运行它,我使用了
warn jar wc.jar MyWordCount/in2/out2
,它运行得非常完美

我不明白是什么问题

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


怎么了

我找到了一种克服这个问题的方法,尽管我不知道到底是什么问题

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

  • 将所需库提取到生成的JAR中
  • 将所需库打包到生成的JAR中
  • 我不知道到底有什么区别,或者这有没有什么大不了的。我以前选择第二个选项,但如果选择第一个选项,我可以使用以下命令运行作业:

    yarn jar myjar.jar PDFWordCount /in /out
    
    yarn jar pdf.jar /in /out
    

    您的jar文件是否有MyMap(MyMap.class)的类文件?它应该作为PDFWORDCUNT$MyMap.class存在于您的jar文件中。请尝试手动检查。我不确定,但是maven应该解决这个问题。我的map和reduce类与main方法在同一个文件中。你能打开jar“myjar.jar”并检查你是否能找到PDFWordCount$MyMap.class,PDFWordCount$MyReduce.class&PDFWordCount.class内部PDFWordCount.MyMap类定义的可见性是什么?它应该是公共静态的。另外,您的
    hadoop类路径
    或$hadoop\u类路径的值是多少?@jtravaglini我应该在哪里找到它?