在Hadoop集群运行Spark Pipeline时遇java.lang.NoSuchFieldError: HIVE_LOCAL_TIME_ZONE错误
java.lang.NoSuchFieldError: HIVE_LOCAL_TIME_ZONE 问题排查 基本情况
- 技术栈:Spark 3.2.4、JDK 1.8、Scala 2.11.12
- 部署方式:打包成Uber-Jar后通过
spark-submit提交 - 依赖处理:Maven中单独引入
hive-serde:3.1.4以解决之前的错误 - 业务流程:从Hive表读取数据,处理后写入Hive表,错误在云环境触发
- 疑问:该错误是否由Jar包冲突导致?
报错日志
23/10/04 09:20:11 INFO yarn.ApplicationMaster: Final app status: FAILED, exitCode: 15, (reason: User class threw exception: java.lang.NoSuchFieldError: HIVE_LOCAL_TIME_ZONE at org.apache.hadoop.hive.serde2.lazy.LazySerDeParameters.extractColumnInfo(LazySerDeParameters.java:166) at org.apache.hadoop.hive.serde2.lazy.LazySerDeParameters.<init>(LazySerDeParameters.java:92) at org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.initialize(LazySimpleSerDe.java:116) at org.apache.spark.sql.hive.execution.HiveTableScanExec.addColumnMetadataToConf(HiveTableScanExec.scala:125) at org.apache.spark.sql.hive.execution.HiveTableScanExec.hadoopConf$lzycompute(HiveTableScanExec.scala:101) at org.apache.spark.sql.hive.execution.HiveTableScanExec.hadoopConf(HiveTableScanExec.scala:98) at org.apache.spark.sql.hive.execution.HiveTableScanExec.hadoopReader$lzycompute(HiveTableScanExec.scala:110) at org.apache.spark.sql.hive.execution.HiveTableScanExec.hadoopReader(HiveTableScanExec.scala:105) at org.apache.spark.sql.hive.execution.HiveTableScanExec.$anonfun$doExecute$2(HiveTableScanExec.scala:211)
结论:就是Jar包冲突导致的
Spark 3.2.4默认依赖的Hive版本是2.3.9,你手动引入的hive-serde:3.1.4和这个版本存在API不兼容问题:
HIVE_LOCAL_TIME_ZONE字段是Hive 3.x版本新增的,而Spark自带的Hive 2.3.9中没有该字段- 打包Uber-Jar时同时包含了两个版本的Hive类,类加载器加载到不匹配的类后,就会触发找不到字段的错误
解决办法
- 移除手动引入的
hive-serde:3.1.4依赖,直接使用Spark自带的Hive SerDe版本 - 如果必须使用Hive 3.x的特性,需要将所有Hive相关依赖统一为3.x版本,同时注意Spark 3.2.x官方仅支持Hive 0.13到2.3.x,使用Hive 3.x可能存在更多兼容性问题
- 打包时给Hive相关依赖添加
provided范围,避免将集群已有的Hive Jar包打入Uber-Jar,从根源减少冲突概率
内容的提问来源于stack exchange,提问作者Yo Yo Money Singh
相关产品推荐
相关产品推荐

