最近在hive裏將mr換成spark引擎後,執行插入和一些複雜的hql會觸發下面的異常:apache
org.apache.hive.service.cli.HiveSQLException: Error while compiling statement: FAILED: SemanticException Failed to get a spark session: org.apache.hadoop.hive.ql.metadata.HiveException: Failed to create Spark client for Spark session c5924990-6187-4a15-a760-ec3b1afbc199
未能建立spark客戶端的緣由有這幾個:vim
1,spark沒有打卡微信
2,spark和hive版本不匹配網絡
3,hive鏈接spark客戶端時長太短session
解決方案:maven
1,在進入hive以前,須要依次啓動hadoop,spark,hiveservice,這樣才能確保hive在啓動spark引擎時能成功ide
spark啓動:oop
cd /opt/spark ./sbin/start-all.sh
2,版本問題是最多見也是出現最多的問題,我用的版本依次爲hadoop3.3.0,hive3.1.2,spark2.4.7,以前測試過spark3.0.1,發現和hive不兼容測試
這裏還須要注意Apache官網的提供瞭如圖所示的幾個spark包版本:ui
但在集成hive時spark自己不能自帶hive配置,因此只有第三個是能夠用的,可是我測試了一下在個人電腦上仍是報錯,因此我選擇了本身編譯,下載最後一個源碼包,解壓後進入spark目錄
輸入命令:
./dev/make-distribution.sh --name without-hive --tgz -Pyarn -Phadoop-3.3 -Dhadoop.version=3.3.0 -Pparquet-provided -Porc-provided -Phadoop-provided
可是發現編譯卡住了,原來編譯會自動下載maven,scala,zinc,存放在build目錄下,如圖:
因爲下載過於緩慢,這裏直接將這三個包放在build目錄下,解壓好,編譯時會自動識別,能夠省去不少時間,快速進入編譯,須要壓縮包的能夠關注公衆號:Tspeaker97 給我發消息找我要
編譯過程比較慢,我花了30分鐘纔將spark編譯好,中間還網絡斷流卡住失敗了一次,若是不能訪問外網的,建議將maven鏡像改成阿里雲。
編譯完成後在spark目錄下就能夠看到編譯出的tgz包,解壓到對應目錄:
vim spark-env.sh 插入以下代碼: export SPARK_DIST_CLASSPATH=$(hadoop classpath)
接下來就是hive的設置,這裏我用的是公司編譯好的版本,大小比Apache官網大一點,想要能夠微信扣我
進入hive/conf目錄:
vim spark-defaults.conf 插入以下代碼: spark.master yarn spark.eventLog.enabled true spark.eventLog.dir hdfs://hadoop01:9820/spark-history spark.executor.memory 2g
在hdfs建立對應目錄並拷貝jar包:
hadoop fs -mkdir /spark-history hadoop fs -mkdir /spark-jars hadoop fs -put /opt/spark/jars/* /spark-jars
在hive/conf/hive-site.xml中增長:(這裏特意延長了hive和spark鏈接的時間,能夠有效避免超時報錯)
<!--Spark依賴位置--> <property> <name>spark.yarn.jars</name> <value>hdfs://hadoop01:9820/spark-jars/*</value> </property> <!--Hive執行引擎--> <property> <name>hive.execution.engine</name> <value>spark</value> </property> <!--Hive和spark鏈接超時時間--> <property> <name>hive.spark.client.connect.timeout</name> <value>100000ms</value> </property>
而後啓動spark服務,hive服務,並進入hive客戶端,執行hql:
set hive.exec.mode.local.auto=true; create table visit(user_id string,shop string) row format delimited fields terminated by '\t'; load data local inpath '/opt/hive/datas/user_id' into table visit; SELECT t1.shop, t1.user_id, t1.count, t1.rank FROM (SELECT shop, user_id, count(user_id) COUNT, rank() over(partition BY shop ORDER BY count(user_id) DESC) rank FROM visit GROUP BY user_id, shop ORDER BY shop ASC, COUNT DESC ) t1 WHERE rank <4;
spark引擎成功啓動:
若是有其餘問題,歡迎叨擾: