Apache Spark JAVA_9 通用语言版本上的 Apacher Hadoop 、Apacher Hive

问题描述 投票:0回答:2

尝试设置 Hive 使用 Spark 作为引擎。

长时间配置后,出现超时错误。

应用程序日志文件纱线日志-applicationId

ERROR yarn.ApplicationMaster: User class threw exception: java.lang.NoSuchFieldError: JAVA_9
    java.lang.NoSuchFieldError: JAVA_9
        at org.apache.spark.storage.StorageUtils$.<init>(StorageUtils.scala:207)
        at org.apache.spark.storage.StorageUtils$.<clinit>(StorageUtils.scala)
        at org.apache.spark.storage.BlockManagerMasterEndpoint.<init>(BlockManagerMasterEndpoint.scala:93)
        at org.apache.spark.SparkEnv$.$anonfun$create$9(SparkEnv.scala:370)

错误在文件中 https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/storage/StorageUtils.scala

private val bufferCleaner: DirectBuffer => Unit =
if (SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_9)) {
  val cleanerMethod =
    Utils.classForName("sun.misc.Unsafe").getMethod("invokeCleaner", classOf[ByteBuffer])
  val unsafeField = classOf[Unsafe].getDeclaredField("theUnsafe")
  unsafeField.setAccessible(true)
  ..

经过研究发现问题出在 common-lang3* jar 文件中。 我使用旧版本将服务器上的所有文件更新为 hadoop 共享、配置单元等中的 commons-lang3-3.9.jar jar。

https://github.com/apache/commons-lang/blob/master/src/main/java/org/apache/commons/lang3/JavaVersion.java

但仍然出现此错误。

java apache-spark hadoop hive
2个回答
0
投票

出现此错误(java.lang.NoSuchFieldError:JAVA_9)是因为,您在 gradle/maven 文件中使用的 common-lang 包中没有 java 版本 9 的枚举。将此版本与 java 17 -> org.apache.commons:commons-lang3:3.12.0 一起使用。在 StorageUtil$.class 中,我们有这个 sninnpet。

 if (SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_9))

并且这在 common-lang 包中不存在,要验证单击 JavaVersion,它将引导您到该类,并检查 java 版本的枚举是否存在。 对于以上版本,我们有这些 JAVA 版本。

public enum JavaVersion {

/**
 * The Java version reported by Android. This is not an official Java version number.
 */
JAVA_0_9(1.5f, "0.9"),

/**
 * Java 1.1.
 */
JAVA_1_1(1.1f, "1.1"),

/**
 * Java 1.2.
 */
JAVA_1_2(1.2f, "1.2"),

/**
 * Java 1.3.
 */
JAVA_1_3(1.3f, "1.3"),

/**
 * Java 1.4.
 */
JAVA_1_4(1.4f, "1.4"),

/**
 * Java 1.5.
 */
JAVA_1_5(1.5f, "1.5"),

/**
 * Java 1.6.
 */
JAVA_1_6(1.6f, "1.6"),

/**
 * Java 1.7.
 */
JAVA_1_7(1.7f, "1.7"),

/**
 * Java 1.8.
 */
JAVA_1_8(1.8f, "1.8"),

/**
 * Java 1.9.
 *
 * @deprecated As of release 3.5, replaced by {@link #JAVA_9}
 */
@Deprecated
JAVA_1_9(9.0f, "9"),

/**
 * Java 9.
 *
 * @since 3.5
 */
JAVA_9(9.0f, "9"),

/**
 * Java 10.
 *
 * @since 3.7
 */
JAVA_10(10.0f, "10"),

/**
 * Java 11.
 *
 * @since 3.8
 */
JAVA_11(11.0f, "11"),

/**
 * Java 12.
 *
 * @since 3.9
 */
JAVA_12(12.0f, "12"),

/**
 * Java 13.
 *
 * @since 3.9
 */
JAVA_13(13.0f, "13"),

/**
 * Java 14.
 *
 * @since 3.11
 */
JAVA_14(14.0f, "14"),

/**
 * Java 15.
 *
 * @since 3.11
 */
JAVA_15(15.0f, "15"),

/**
 * Java 16.
 *
 * @since 3.11
 */
JAVA_16(16.0f, "16"),

/**[enter image description here][1]
 * Java 17.
 *
 * @since 3.12.0
 */
JAVA_17(17.0f, "17"),

0
投票

在我们的例子中,用户使用的是带有 Hadoop 的 Spark 3.2.2,它依赖于 commons-lang3 3.12。 commons-lang3 包含枚举

JavaVersion
,其中包含
JAVA_9

此外,用户将 hive-jdbc-2.1.1-cdh6.3.4-standalone.jar 添加到类路径中,其中包含较旧版本的 commons-lang3,但不包含

JAVA_9

用户的 Spark 安装将

userClassPathFirst
设置为
true
,因此选择了旧版本的 commons-lang3。

© www.soinside.com 2019 - 2024. All rights reserved.