背景
需要使用spark腳本讀寫hive數據
又需要讓hive mr引擎使用spark,從而從kettle入口觸發hive交互時hive能夠用到spark性能
版本依賴
原生apache :
hive 2.3.3
spark 2.1.0
spark 2.1.0-without-hadoop
hadoop 2.6.5
問題所在
因爲sparksql使用hive倉庫需使用到完整的hive,hdfs依賴包,因此需要使用apache預編譯好的hadoop整合包,否則無論在spark-shell環境還是spark-submit提交作業都會報出hive類異常之類的錯誤
Caused by: java.lang.IllegalArgumentException: Unable to instantiate SparkSession with Hive support
Unable to instantiate SparkSession with Hive support because Hive classes are not found
而使用預編譯包,在hive中使用spark引擎的話,又會發生
java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS
的錯誤,這個時候需要非預編譯hive的spark工程,相當矛盾。
解決方法
利用spark在driver運行節點classpath下獲取相關jars的原理,在hive運行節點使用spark-without-hadoop包。而在yarn nodemanager節點使用spark預編譯包,sparksql提交的腳本driver也運行於這幾個節點。
節點名稱 | 節點功能 | 使用部署包 | 運行說明 |
---|---|---|---|
master1 | 主節點 | spark-2.1.0-bin-without-hadoop.tgz hive-2.3.3.tar |
yarn resourcemanager,hive |
master2 | 主節點備用 | spark-2.1.0-bin-without-hadoop.tgz hive-2.3.3.tar |
yarn resourcemanager,hive |
slave1 | 運算節點1 | spark-2.1.0-bin-hadoop2.6.tgz | yarn nodemanager, 使用spark shell/submit |
slave2 | 運算節點2 | spark-2.1.0-bin-hadoop2.6.tgz | yarn nodemanager, 使用spark shell/submit |
slave3 | 運算節點3 | spark-2.1.0-bin-hadoop2.6.tgz | yarn nodemanager, 使用spark shell/submit |