【问题标题】:org/apache/spark/network/util/ByteUnit : Unsupported major.minor version 52.0org/apache/spark/network/util/ByteUnit:不支持的major.minor 52.0版
【发布时间】:2018-07-17 17:18:26
【问题描述】:

我正在尝试在 Yarn 上运行 Spark。

我运行的是 Spark 1.6.0,这对 Yarn (hadoop 2.7.1) 没问题。然后,我使用相同的 Yarn 升级到 Spark 2.2.1,我的应用程序都因为这个错误而失败:

Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/spark/network/util/ByteUnit : Unsupported major.minor version 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:803)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:442)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:64)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:354)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:348)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:347)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at org.apache.spark.internal.config.package$.<init>(package.scala:41)
    at org.apache.spark.internal.config.package$.<clinit>(package.scala)
    at org.apache.spark.deploy.yarn.ApplicationMaster.<init>(ApplicationMaster.scala:73)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$main$1.apply$mcV$sp(ApplicationMaster.scala:763)
    at org.apache.spark.deploy.SparkHadoopUtil$$anon$2.run(SparkHadoopUtil.scala:67)
    at org.apache.spark.deploy.SparkHadoopUtil$$anon$2.run(SparkHadoopUtil.scala:66)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)
    at org.apache.spark.deploy.SparkHadoopUtil.runAsSparkUser(SparkHadoopUtil.scala:66)
    at org.apache.spark.deploy.yarn.ApplicationMaster$.main(ApplicationMaster.scala:762)
    at org.apache.spark.deploy.yarn.ExecutorLauncher$.main(ApplicationMaster.scala:785)
    at org.apache.spark.deploy.yarn.ExecutorLauncher.main(ApplicationMaster.scala)

经过一些研究,我发现这是由于使用比用于运行的版本更旧的 JDK 版本完成的构建。我正在运行 Java 7,现在我安装了 Java 8 和 java -version 显示(在 master 和 worker 中):

java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

和 javac 版本:

javac 1.8.0_161

我预计升级后错误会停止,但它没有。

这个错误是否与 HADOOP_CONF_DIR 的任何 conf 文件有关?或者也许我在升级 java 时做错了(任何环境变量或类似的东西)

任何帮助将不胜感激,谢谢

【问题讨论】:

  • 您是否在 conf/hadoop-env.sh 中使用自定义 JAVA_HOME ?如果是,那么您需要更改那里的路径。
  • 我的 hadoop-env.sh 包含 export JAVA_HOME=${JAVA_HOME} 其中 $JAVA_HOME = /usr/lib/jvm/java-8-oracle
  • @Shailendra 任何帮助
  • 你能检查 spark/yarn 的启动日志以确认它使用的是 Java 8 吗?

标签: java apache-spark hadoop-yarn


【解决方案1】:

当您的 JDK 版本低于 Java 应用程序中的 .class 文件时,将引发 UnsupportedClassVersionError。

问题是因为 Java 版本不匹配。如果您查看Wikipedia Java Class Reference,您可以看到您的应用程序的新版本需要Java 8:

  • J2SE 17 = 61
  • J2SE 16 = 60
  • J2SE 15 = 59
  • J2SE 14 = 58
  • J2SE 13 = 57
  • J2SE 12 = 56
  • J2SE 11 = 55
  • J2SE 10 = 54
  • J2SE 9 = 53
  • J2SE 8 = 52
  • J2SE 7 = 51
  • J2SE 6.0 = 50
  • J2SE 5.0 = 49
  • JDK 1.4 = 48
  • JDK 1.3 = 47
  • JDK 1.2 = 46
  • JDK 1.1 = 45

如果您有 Java 8 并且仍然收到此错误,则应更改 JAVA_HOME 环境变量的内容。

如果您仍然收到此错误,您应该查看Stackoverflow question(或者您可以随时从系统中删除所有旧版本的 Java...)。

显然你必须在 spark-defaults.conf 中添加 spark.executorEnv.JAVA_HOME=/usr/java/。请注意,您可以使用 --conf 在命令行中提供它。

http://spark.apache.org/docs/latest/configuration.html#runtime-environment

【讨论】:

  • 我的 ~/.bashrc 中有这个 export JAVA_HOME=/usr/lib/jvm/java-8-oracle export PATH=$JAVA_HOME/bin:$PATH
  • 更新了我的答案以添加火花特定信息。
  • bin/spark-submit --master yarn --deploy-mode cluster --conf spark.executorEnv.JAVA_HOME="/usr/lib/jvm/java-8-oracle" --py-文件 /home/hadoop/opentsdb_pandas-master/opentsdb_pandas.py /home/hadoop/opentsdb_pandas-master/first.py 尝试了这个,但仍然没有,我很绝望。有什么帮助吗? @卡拉巴辛
  • 此时我将删除所有其他 Java 版本,如果它仍然发生,我会在 Spark 文件夹结构中找到该 Java 版本,或者我会在 Spark 中查找所有配置文件以查找任何不同的使用版本。
【解决方案2】:

很可能,您有一个启动文件(start.batstart.sh 之类的东西),其中包含 Java 安装的路径。它也可以在配置文件中。如果卸载 Java 7 会发生什么?如果您收到找不到 Java 可执行文件的错误消息,那么这就是您的答案。

【讨论】:

  • 当我尝试独立运行 Spark 时,它可以工作,但是当涉及到 yarn 时,它会抛出该错误。那会是 start-yarn.sh 使用 yarn-env.sh 吗?
  • 好吧,我之前没有启动脚本,但是您的服务器使用的 JVM 不支持 Java 8。启动脚本通常不依赖用户的路径,因此代码启动文件或某些配置文件中的 Java 路径。我会开始寻找那里,就像在 bin 目录中一样。
【解决方案3】:

JAVA_HOME设置为/etc/hadoop/conf/hadoop-env.sh中的JDK1.8路径(例如/usr/java/jdk1.8.0_151),重启资源管理器和节点管理器服务,然后提交spark作业。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 2016-12-28
    • 2018-08-24
    • 1970-01-01
    相关资源
    最近更新 更多