Hadoop ClassNotFoundException

我正在编写我的第一个Hadoop应用程序,但是我收到了一个错误。 我不太明白这个堆栈跟踪中的一些detials是什么意思。 这是一个ClassNotFoundException 。 我正在Ubuntu Linux v12.10,Eclipse 3.8.0,Java 1.6.0_24上构建它。 我通过从Apache站点下载并使用Ant构建Hadoop来安装Hadoop。

当我创建一份工作时,我的崩溃就在程序的第一行。

 public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException { Job job = new Job(); <<== crashing here. Program [Java Application] com.sandbox.hadoop.Program at localhost:33878 Thread [main] (Suspended (exception ClassNotFoundException)) owns: Launcher$AppClassLoader (id=29) owns: Class (org.apache.hadoop.security.UserGroupInformation) (id=25) URLClassLoader$1.run() line: 217 AccessController.doPrivileged(PrivilegedExceptionAction, AccessControlContext) line: not available [native method] Launcher$AppClassLoader(URLClassLoader).findClass(String) line: 205 Launcher$AppClassLoader(ClassLoader).loadClass(String, boolean) line: 321 Launcher$AppClassLoader.loadClass(String, boolean) line: 294 Launcher$AppClassLoader(ClassLoader).loadClass(String) line: 266 DefaultMetricsSystem.() line: 37 DefaultMetricsSystem.() line: 34 UgiInstrumentation.create(Configuration) line: 51 UserGroupInformation.initialize(Configuration) line: 216 UserGroupInformation.ensureInitialized() line: 184 UserGroupInformation.isSecurityEnabled() line: 236 KerberosName.() line: 79 UserGroupInformation.initialize(Configuration) line: 209 UserGroupInformation.ensureInitialized() line: 184 UserGroupInformation.isSecurityEnabled() line: 236 UserGroupInformation.getLoginUser() line: 477 UserGroupInformation.getCurrentUser() line: 463 Job(JobContext).(Configuration, JobID) line: 80 Job.(Configuration) line: 50 Job.() line: 46 Program.main(String[]) line: 17 /usr/lib/jvm/java-6-openjdk-amd64/bin/java (Jan 14, 2013 2:42:36 PM) 

控制台输出:

 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/configuration/Configuration at org.apache.hadoop.metrics2.lib.DefaultMetricsSystem.(DefaultMetricsSystem.java:37) at org.apache.hadoop.metrics2.lib.DefaultMetricsSystem.(DefaultMetricsSystem.java:34) at org.apache.hadoop.security.UgiInstrumentation.create(UgiInstrumentation.java:51) at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:216) at org.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:184) at org.apache.hadoop.security.UserGroupInformation.isSecurityEnabled(UserGroupInformation.java:236) at org.apache.hadoop.security.KerberosName.(KerberosName.java:79) at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:209) at org.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:184) at org.apache.hadoop.security.UserGroupInformation.isSecurityEnabled(UserGroupInformation.java:236) at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:477) at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:463) at org.apache.hadoop.mapreduce.JobContext.(JobContext.java:80) at org.apache.hadoop.mapreduce.Job.(Job.java:50) at org.apache.hadoop.mapreduce.Job.(Job.java:46) at com.sandbox.hadoop.Program.main(Program.java:18) Caused by: java.lang.ClassNotFoundException: org.apache.commons.configuration.Configuration at java.net.URLClassLoader$1.run(URLClassLoader.java:217) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205) at java.lang.ClassLoader.loadClass(ClassLoader.java:321) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) at java.lang.ClassLoader.loadClass(ClassLoader.java:266) ... 16 more 

您应该添加/usr/lib/hadoop-0.xx/lib找到的所有jar以避免这种类路径问题。

为了给你一个想法,你可以输入hadoop classpath ,它将打印出获取Hadoop jar和所需库所需的类路径。

在你的情况下,你错过了hadoop-common-0.xx.jar ,所以你应该把它添加到类路径中,你应该好好去。

你的主程序是否需要org.apache.commons.configuration.Configuration或者这应该是org.apache.hadoop.conf.Configuration

看起来Eclipse已经自动导入了错误的Configuration类,当您的集群上运行hadoop时,该类不在类路径上。

你能分享你的源代码,特别是com.sandbox.hadoop.Program类, main方法吗?

我遇到了同样的问题。我通过将commons-configuration-xxjar添加到我的构建路径来解决它。它位于$ HADOOP_HOME / lib下。