spark hive java.lang.NoSuchFieldError: HIVE_STATS_JDBC_TIMEOUT

java.lang.NoSuchFieldError: HIVE_STATS_JDBC_TIMEOUTjava

这个问题我感受是hive给spark挖的一个大坑。spark版本是2.4.4,hive是3git

这个问题,基本发生在远程启动spark客户端,而且访问spark集群,而后再链接hive形成的。由于,不管升级到spark的什么版本,用hive的什么版本,在集群环境下直接启动spark-sql或者spark-shell访问hive都不会发生这个问题。只有在用代码集成hive-jdbc,spark-core,spark-sql,spark-hive等依赖的时候,就会报出这么一个问题。github

致使这个问题的缘由以下:用代码启动spark,而且链接spark standalone 或者yarn模式spark-client方式的时候,本地机器会成为driver,diver负责向hive通讯。代码在通讯的过程当中,须要依赖hive相关的jar包。在链接hive以前,spark会进行一下链接相关参数的检查,检查的参数来自于hive的jar包,其中就有这么一个:HIVE_STATS_JDBC_TIMEOUT。然而,spark集群下面依赖的hive的jar包仍是1.2.1版本的,因此集群模式链接hive没有问题。而后hive升级到了2以后的版本,hive去掉了这个参数(你们能够如今去spark的github上面看看最新的代码,里面已经作了相关修改,可是命名仍是:hardcode。),而后spark-sql里面的代码依然是要调用hive的这个参数的,而后就报错了。sql

这个问题在jira上说加上 spark.sql.hive.metastore.jars  spark.sql.hive.metastore.version这两个参数(固然这两个参数仍是要加的),而后这两个参数并不能解决这个问题,由于在用到这两个jar包以前,spark就已经对链接hive参数进行了检测。shell

因此最终解决办法是:在spark 2.4.4的代码中,删除掉HIVE_STATS_JDBC_TIMEOUT以及另一个参数,而后从新编译spark-hive的jar包。再 将此jar包替换现有的spark-hive的jar包。spa

最后,应该是在spark3的版本中,会完全解决这个问题。code

相关文章
相关标签/搜索