hadoop上的UnsupportedClassVersionError没有明显的版本更改

时间:2014-06-21 22:17:21

标签: java maven hadoop version

我正在我的大学集群上运行一个hadoop作业,但是失败了以下错误:

hadoop jar target/SpamClassifier-1.0-SNAPSHOT-jar-with-dependencies.jar <args>
Exception in thread "main" java.lang.UnsupportedClassVersionError: infolab/social/spam/FeatureApp : Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:205)

我已经做了一些阅读,看起来这可能是因为jar是使用与运行时版本不同的java版本编译的。我尝试在hadoop master本身上构建(因为我喜欢允许shell访问机器的奢侈品),但它无济于事。

Java版本:

$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

Maven版本:

Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-17 09:22:22-0600)
Maven home: /opt/apache-maven-3.1.1
Java version: 1.7.0_45, vendor: Oracle Corporation
Java home: /usr/java/jdk1.7.0_45/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-431.5.1.el6.x86_64", arch: "amd64", family: "unix"

Hadoop版本(Hortonworks):

$ hadoop version
Hadoop 2.2.0.2.0.6.0-102
Subversion git@github.com:hortonworks/hadoop.git -r 02ad68f19849a0a986dac36b705491f6791f9179
Compiled by jenkins on 2014-01-21T00:56Z
Compiled with protoc 2.5.0
From source with checksum 66f6c486e27479105979740178fbf0
This command was run using /usr/lib/hadoop/hadoop-common-2.2.0.2.0.6.0-102.jar

我正在用maven构建所有这些,下面是我的pom.xml的摘录,它指定了java版本:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>

我真的很茫然。是不是因为某种原因,maven正在使用不同版本的java进行编译?我认为我们甚至没有安装不同的版本。

2 个答案:

答案 0 :(得分:1)

我认为您安装了多个版本的 java 或者以前在您的系统上安装了某个版本,另一个版本带有 hadoop (如果有的话)。

您正在使用其中一个进行编译并与其他人一起启动。

将环境变量PATH设置的内容复制到文本中,并检查PATH上已安装版本的位置。如果是,请删除其中一个并保存PATH

您还可以检查 maven 设置,其中应清楚地显示设置JAVA_HOME

你也可以:

  1. 删除自动构建
  2. 清理项目
  3. 使用maven构建:maven - &gt;构建

答案 1 :(得分:1)

感谢大家的帮助。问题的根源是hadoop配置,它覆盖了我的JAVA_HOME。 Hadoop在其hadoop-env.sh配置文件中配置自定义环境。我的线路配置不正确:

export JAVA_HOME=/usr/jdk64/jdk1.6.0_31  

这是我们使用Hortonworks hadoop套件的结果,该套件利用Ambari并在初始设置时设置独立的jdk分布。升级我们的hortonworks版本并重新配置后,我们的mapreduce作业正常运行。