java - 如何使 hadoop 使用与 `javac` 相同的 Java 运行时版本?

标签 java hadoop

我尝试看看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?)来编译它。要么:

  1. 使用 -target 标志将 Java 程序编译为旧版本的 java。 IE。 -目标1.8
  2. 让 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/

相关文章:

hadoop - 如何将hbase数据索引到solr

Hadoop 辅助 NameNode IP 地址

python - 为什么这些似乎正确的hadoop流python脚本不起作用?

java - 无法连接到 Selenium 网格节点

java - 在 Java 中实现 SIFT

Hadoop 集群 - "hadoop"用户 ssh 通信

hadoop - 用于写入文件的水槽配置 ~100mb(接近 120mb hdfs 文件大小)

Java android 10 创建文件的问题

java - 用户输入方式

java - 在 jaxws 处理程序中反序列化 header