运行hadoop时发生Classnotfound异常

时间:2010-05-07 02:51:32

标签: java hadoop

我是hadoop的新手。

我有一个文件Wordcount.java,它引用了hadoop.jar和stanford-parser.jar

我正在运行以下commnad

javac -classpath .:hadoop-0.20.1-core.jar:stanford-parser.jar -d ep WordCount.java 

jar cvf ep.jar -C ep .

bin/hadoop jar ep.jar WordCount gutenburg gutenburg1

执行后我收到以下错误:

lang.ClassNotFoundException: edu.stanford.nlp.parser.lexparser.LexicalizedParser

该课程在stanford-parser.jar ...

可能出现什么问题?

由于

6 个答案:

答案 0 :(得分:2)

我认为你还需要在调用hadoop时添加standford-parser jar,而不仅仅是编译器。 (如果你查看ep.jar,我想它里面只有一个文件 - WordCount.class)

E.g。

bin/hadoop jar ep.jar WordCount -libjars stanford-parser.jar gutenburg gutenburg1

See Map/Reduce Tutorial

答案 1 :(得分:1)

mdma在正确的轨道上,但您还需要您的工作驱动程序来实现工具。

答案 2 :(得分:1)

我遇到了同样的问题。我认为你的程序无法识别-libjars选项的原因是因为你没有通过调用GenericOptionsParser.getRemainingArgs()来解析它。在Hadoop 0.21.0的WordCount.java示例中(在mapred / src / examples / org / apache / hadoop / examples /中),找到了这段代码,在我的程序中执行相同操作后,-libjars comma-已分离的罐子被识别:

String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
  System.err.println("Usage: wordcount <in> <out>");
  System.exit(2);
}

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

答案 3 :(得分:1)

我刚刚发现你可以简单地编辑$ HADOOP_HOME / conf / hadoop-env.sh并将你的JAR添加到HADOOP_CLASSPATH。 这可能是最简单和最有效的。

答案 4 :(得分:0)

你可以尝试的另一个选项,因为-libjars似乎不适合你,就是将所有内容打包到一个jar中,即你的代码+依赖于一个jar。

这就是在~Hadoop-0.18.0之前必须完成的事情(在那里他们修复了这个)。

使用ant(我在eclipse中使用ant),您可以设置一个解包依赖项的构建,并将它们添加到目标构建项目中。你可以自己解决这个问题,方法是手动解压缩依赖jar并将内容添加到你的jar中。

即使我现在使用0.20.1,我仍然使用这种方法。它使得从命令行开始的工作更简单。

答案 5 :(得分:-1)

@Kuro Kurosaka我下载了hadoop的源jar,打开它,得出了同样的结论。这是Web上可用的WordCount示例中缺少的必要代码。使用GenericOptionParser和-libjars参数修复了我的嵌套ClassNotFound异常并且我的作业正在运行。