尝试设置 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)
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。
但仍然出现此错误。
出现此错误(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"),
在我们的例子中,用户使用的是带有 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。