我尝试看看hadoop自己的命令是否可以运行一个由javac
直接编译的mapreduce应用程序(来自Hadoop的MapReduce官方文档)而不是hadoop自己的命令。
我编译了一个由javac
直接编译的MapReduce应用程序
$ javac -classpath "$(~/programs/hadoop/hadoop-3.1.2/bin/hadoop classpath)" -d target/classes/myapp/ src/main/java/myapp/WordCount.java
并创建一个jar文件
$ jar -cvf WordCount.jar -C target/classes/myapp/ .
为什么我用hadoop自带的命令无法运行jar文件?
$ export HADOOP_CLASSPATH=$JAVA_HOME/lib/tools.jar
$ rm -r ./output/
$ ~/programs/hadoop/hadoop-3.1.2/bin/hadoop jar WordCount.jar WordCount ./input/ ./output/
Exception in thread "main" java.lang.UnsupportedClassVersionError: WordCount has been compiled by a more recent version of the Java Runtime (class file version 54.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.hadoop.util.RunJar.run(RunJar.java:311)
at org.apache.hadoop.util.RunJar.main(RunJar.java:232)
如何使 hadoop jar
使用与 javac
相同的 Java 运行时版本?
谢谢。
最佳答案
您使用比运行的 hadoop 更新版本的 Java(看起来像 Java SE 10?)来编译它。要么:
- 使用
-target
标志将 Java 程序编译为旧版本的 java。 IE。-目标1.8
- 让 hadoop 使用与您编译程序相同的 Java 运行时。应该有一个 hadoop-env.sh 文件,由 hadoop 调用来设置 JAVA_HOME。
在您的 HADOOP_HOME/conf 目录下,请更新 hadoop-env.sh 文件。它具有导出JAVA_HOME的入口。
在此文件中设置适当的 JAVA_HOME 应该可以解决您的问题。
关于java - 如何使 hadoop 使用与 `javac` 相同的 Java 运行时版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56240623/