2

只是在提出问题之前说明我的设置,

Hadoop Version : 1.0.3

默认的 WordCount 示例运行良好。但是当我根据这个页面http://hadoop.apache.org/common/docs/r0.20.2/mapred_tutorial.html创建了一个新的 WordCount 程序时

我编译它并以与教程中给出的类似方式对其进行 jar-ed。但是当我使用它运行它时:

/usr/local/hadoop$ bin/hadoop jar wordcount.jar org.myorg.WordCount ../Space/input/ ../Space/output

我收到以下错误,

java.lang.RuntimeException: java.lang.ClassNotFoundException: org.myorg.WordCount$Map

整个错误日志已粘贴在这里: http: //pastebin.com/GNbsfpg3

我哪里做错了?

4

4 回答 4

5

错误信息中有一些线索:

12/07/14 18:09:38 WARN mapred.JobClient:使用 GenericOptionsParser 解析参数。应用程序应该实现同样的工具。

12/07/14 18:09:38 WARN mapred.JobClient:没有设置作业 jar 文件。可能找不到用户类。请参阅 JobConf(Class) 或 JobConf#setJar(String)。

您需要与我们共享您的驱动程序代码(您在其中创建和配置作业),但您似乎没有配置“作业 jar”,也就是说,作业客户端没有提示您在哪里代码被捆绑到一个 jar 中,因此当您运行作业时,当地图实例实际运行时无法找到这些类。

你可能想要类似的东西

jobConf.setJarByClass(org.myorg.WordCount.class);
于 2012-07-14T13:38:31.573 回答
3

我遇到了完全相同的问题,并通过在主代码中添加以下内容来解决它

jobConf.setJarByClass(org.myorg.WordCount.class);

在这里你可以找到完整的主要功能 Configuration conf = new Configuration();

    Job job = new Job(conf, "wordcount");
    job.setJarByClass(org.myorg.WordCount.class);

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);

job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);

job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);

FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));

job.waitForCompletion(true);
于 2014-12-17T15:54:08.640 回答
0

我也得到了上述错误。我所做的只是将 jar 文件复制到集群的所有节点中并设置类路径,以便每个从节点都可以访问这个 jar。这对我有用。它可能会帮助你。

于 2013-05-30T11:38:18.117 回答
-1

在 runJob 之前,像这样设置 conf: conf.setJar("Your jar file name"); 它可能有效,试试吧!

于 2013-08-19T08:19:12.230 回答