Spark操作Hive执行select等DML语句报NoSuchMethodError如何解决
错误根本原因
这个NoSuchMethodError异常是Spark内置依赖的Hive版本与你集群部署的Hive版本不匹配导致的。org.apache.hadoop.hive.ql.exec.Utilities.copyTableJobPropertiesToConf方法在不同Hive版本中存在签名差异甚至被移除,Spark运行时加载了不符合版本要求的Hive类,就会抛出方法不存在的错误。
解决方案
版本对齐验证
先确认你使用的Spark版本官方默认绑定的Hive版本:比如Spark 3.3.x默认适配Hive 2.3.9,Spark 2.4.x默认适配Hive 1.2.1。再核对集群部署的Hive大版本,保证二者完全一致,这是成本最低的解决方案。排除项目内冲突的Hive依赖
如果你是通过SBT/Maven/Gradle打包项目,不要将Hive相关依赖打入最终的业务jar包,将所有Hive依赖的scope设置为provided,运行时优先使用Spark/集群环境自带的适配版本依赖。
SBT配置示例:
Maven配置示例:libraryDependencies += "org.apache.hive" % "hive-exec" % "对应Hive版本号" % Provided<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>对应Hive版本号</version> <scope>provided</scope> </dependency>修正错误配置
你代码中config("hadoop.home.dir", "hdfs://pc001:8082/user/hive/warehouse")配置错误,hadoop.home.dir应该指向本地Hadoop客户端的安装目录,Hive仓库地址不需要手动配置,只需要将集群的hive-site.xml放入项目的resources目录下,Spark会自动读取对应配置。自定义编译适配版本Spark
如果无法对齐集群Hive和Spark默认绑定的Hive版本,可以下载对应版本的Spark源码,编译时指定集群Hive版本:
使用自定义编译的Spark运行任务即可解决版本不兼容问题。./dev/make-distribution.sh --name custom-hive-spark --tgz -Phive -Phive-thriftserver -Dhive.version=你的集群Hive版本号
内容的提问来源于stack exchange,提问作者Norni
相关产品推荐
相关产品推荐

