【问题标题】:NoClassDefFoundError Error in HadoopHadoop 中的 NoClassDefFoundError 错误
【发布时间】:2013-05-30 06:05:36
【问题描述】:

所以在浏览了很多关于 SO 的帖子并修改了一些 java 基础知识后,我仍然收到这个错误

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/io/Writable
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2451)
at java.lang.Class.getMethod0(Class.java:2694)
at java.lang.Class.getMethod(Class.java:1622)
at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)

我知道 Java 中 java.lang.NoClassDefFoundErrorClassNotFoundException 之间的区别,并查看了通常导致它的原因。简而言之,这是因为某些类在运行时对程序不可用,但在编译时可用。因此我没有编译时错误。

我添加了两个类路径,一个到commons-logging-1.1.3.jar,另一个到hadoop-core.*jar。 我非常确信类路径是正确的。

这是我的程序中的导入

import java.io.*;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.SequenceFile.*;
import org.apache.hadoop.io.SequenceFile.Writer;
import org.apache.hadoop.io.*;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.*;

【问题讨论】:

  • 这个类在 hadoop-core jar 中,你能准确地写出你是如何运行你的工作的(包括类路径)吗?
  • @CharlesMenguy 我使用的是 ubuntu 12.04,这是编译它的命令行 javac -cp "/home/hduser/hadoop/hadoop-core-1.1.2.jar:/home/hduser/Documents /commons-logging-1.1.3/commons-logging-1.1.3.jar" TSVtoSeq.java 要运行,java TSVtoSeq TrainingT1.tsv testOutput 2 个参数被传递给主文件、输入文件和输出文件
  • 您在运行程序时没有使用java -cp $JARS 设置类路径吗?
  • @CharlesMenguy 所以,我在运行程序时添加了类路径(但有必要吗?),我仍然抛出相同的异常。但是,现在指向的类是“org/apache/commons/configuration/Configuration”而不是“org/apache/hadoop/io/Writable”
  • @shashlearner 那是因为有很多 jars hadoop 依赖(可以在 HADOOP_HOME/lib 中找到)并且在运行时其中几个被引用。要么继续手动试错,直到你让它运行,要么在你运行它时将所有这些 jars 添加到类路径中。一种标准方法是创建一个 jar 代码并使用 bin/hadoop 脚本运行,如下面我的回答中所述。

标签: java hadoop runtime-error noclassdeffounderror


【解决方案1】:

您需要使用给定here 的 java 代码创建一个 jar:

$ mkdir my_classes 
$ javac -classpath $HADOOP_HOME/hadoop-$HADOOP_VERSION-core.jar -d my_classes <name of the main class> 
$ jar -cvf <name of the jar> -C my_classes .

以这种方式运行 jar:

$HADOOP_HOME/bin/hadoop jar <name of the jar> <name of the main class> <arguments to the program>

jar命令的描述见hadoop的documentation page

【讨论】:

  • 感谢您的回复。我已经完全按照他们在文档here 中的要求完成了运行,我收到一个新错误,即:线程“main”java.lang.ClassNotFoundException 中的异常:WordCount
  • @shashlearner 我给的那个是用于字数统计的例子。不要盲目使用该命令。你需要用你的类名替换东西。
  • @shashlearner 好的。您能否提供这些详细信息:您使用的命令、您的源代码、您遇到的错误等。
  • 谢谢! Hadoop 根目录:/home/hduser/hadoop 我的源代码在这里:/home/hduser/hadoop/TST_CLASS/hello/WordCount.java 源代码是文档here/home/hduser/hadoop/TST_CLASS/ 中的确切核心hello/MANIFEST.MF MANIFEST.MF 包含一行: Main-Class: org.myorg.WordCount /home/hduser/hadoop/TST_CLASS/hello/commons-logging-1.1.3-tests.jar 我首先编译WordCount。 java使用:sudo javac -classpath /home/hduser/hadoop/hadoop-core-1.1.2.jar WordCount.java
猜你喜欢
  • 1970-01-01
  • 2021-02-13
  • 2015-11-23
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多