运行hadoop jar时ClassNotFoundException

时间:2016-01-07 03:48:49

标签: java hadoop jar mapreduce

我正在尝试从jar文件运行MapReduce作业,并且不断收到ClassNotFoundException错误。我在Centos 6虚拟机上运行Hadoop 1.2.1。

首先,我使用以下shell脚本exercise.java将文件exercise.jar(和类)编译到jar文件compile.sh中:

#!/bin/bash

javac -classpath /pathto/hadoop-common-1.2.1.jar:\
/pathto/hadoop-core-1.2.1.jar /pathto/exercise.java

jar cvf exercise.jar /pathto/*.class

运行正常,jar成功完成。然后,我尝试使用shell脚本exec.sh运行实际的MapReduce作业:

#!/bin/bash

export CLASSPATH=$CLASSPATH:/pathto/hadoop-common-1.2.1.jar:\
/pathto/hadoop-core-1.2.1.jar:/pathto/exercise.class

hadoop jar exercise.jar exercise /data/input/inputfile.txt /data/output

这会导致ClassNotFoundException错误:

Exception in thread "main" java.lang.ClassNotFoundException: exercise
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:274)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:153) 

我意识到明确的路径名称可能没有必要,但我有点绝望地仔细检查一切。我已确认在我的exercise.java文件中exercise.class已通过job.setJarByClass(exercise.class);进入作业配置,并且已确认exercise.class已包含在exercise.jar中。似乎无法弄明白。

更新 exec.sh脚本的完整路径为exercise.class。它存储在我的Eclipse项目目录中:

#!/bin/bash

export CLASSPATH=$CLASSPATH:/pathto/hadoop-common-1.2.1.jar:\
/pathto/hadoop-core-1.2.1.jar:/home/username/workspace/MVN_Hadoop/src/main/java.com.amend.hadoop.MapReduce/*

hadoop jar \
exercise.jar \
/home/username/workspace/MVN_Hadoop/src/main/java.com.amend.hadoop.MapReduce/exercise \
/data/input/inputfile.txt \
/data/output

当我实际尝试使用明确写出的路径名运行exec.sh脚本时,我也会得到一组完全不同的错误:

Exception in thread "main" java.lang.ClassNotFoundException: /home/hdadmin/workspace/MVN_Hadoop/src/main/java/come/amend/hadoop/MapReduce/exercise
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:274)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:153) 

1 个答案:

答案 0 :(得分:0)

我可以看到这可能的错误。 从 Hadoop jar exercise.jar exercise /data/input/inputfile.txt / data / output 中,请指定练习课的完整路径。 I.e org.name.package.exercise 如果存在。要交叉检查打开jar文件并检查exercise.class位置的位置。 为了继续,Hadoop不希望jar被包含在jar中,因为Hadoop的路径是全局设置的。

NEW: 看,下面的路径有些奇怪。 “/家/ hdadmin /工作区/ MVN_Hadoop / SRC /主/爪哇/来/修改/ hadoop的/ MapReduce的/运动”

如果你正在使用你的jar运行,那么类路径怎么可能如此具体,而不是jar路径。它只能是“来/修改/ hadoop / MapReduce / exercise”这个。