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

相關文章
相關標籤/搜索