Hive on Spark 官網詳情:https://cwiki.apache.org//confluence/display/Hive/Hive+on+Spark:+Getting+Started
參考:https://www.cnblogs.com/wh984763176/p/13503875.html
版本要求:(版本很重要)
安裝和Spark對應版本一起編譯的Hive,當前官網推薦的版本關系如下:
環境要求:三台linux服務器,安裝好spark,並配置好spark on yarn模式。
安裝好hive和metastore。
安裝spark與hive
安裝spark可以參考前面的文章:
Spark集群環境搭建——部署Spark集群:https://www.cnblogs.com/doublexi/p/15624795.html
安裝hive,可以參考:
Hive安裝部署:https://www.cnblogs.com/doublexi/p/15636547.html
配置Hive on Spark
1、查看當前的計算引擎
set hive.execution.engine;
可以看到hive默認的計算引擎為MR,而且有提示,這個配置即將被廢棄了,推薦使用spark或者tez
2、在線修改計算引擎為spark
set hive.execution.engine=spark;
這種方式只在當前終端有效,終端關閉,再打開又恢復為了mr。
想要永久修改引擎為spark,可以修改配置文件
3、修改hive-site.xml
<!-- 使用spark計算引擎 --> <property> <name>hive.execution.engine</name> <value>spark</value> </property> <!-- 這個配置注釋掉,本次不能用 <property> <name>spark.master</name> <value>spark://dev-spark-master-206:7077</value> </property> --> <property> <name>spark.home</name> <value>/data/apps/spark-3.1.2/</value> </property> <property> <name>spark.master</name> <value>yarn</value> </property> <property> <name>spark.eventLog.enabled</name> <value>true</value> </property> <property> <name>spark.eventLog.dir</name> <value>hdfs://dev-spark-master-206:8020/spark-eventlog</value> </property> <property> <name>spark.executor.memory</name> <value>512m</value> </property> <property> <name>spark.driver.memory</name> <value>512m</value> </property> <property> <name>spark.serializer</name> <value>org.apache.spark.serializer.KryoSerializer</value> </property> <property> <name>spark.yarn.jars</name> <value>hdfs://dev-spark-master-206:8020/spark-jars/*</value> </property> <property> <name>hive.spark.client.server.connect.timeout</name> <value>300000</value> </property>
4、拷貝jar包和xml配置
將Hive的lib目錄下的指定jar包拷貝到Spark的jars目錄下:
hive-beeline-3.1.2.jar hive-cli-3.1.2.jar hive-exec-3.1.2.jar hive-jdbc-3.1.2.jar hive-metastore-3.1.2.jar [root@dev-spark-slave-171 hive-3.1.2]# cd /data/apps/hive-3.1.2/lib/ [root@dev-spark-slave-171 lib]# cp hive-beeline-3.1.2.jar hive-cli-3.1.2.jar hive-exec-3.1.2.jar hive-jdbc-3.1.2.jar hive-metastore-3.1.2.jar /data/apps/spark-3.1.2/jars/
將Spark的jars目錄下的指定jar包拷貝到Hive的lib目錄下: (重要)
spark-network-common_2.12-3.1.2.jar spark-core_2.12-3.1.2.jar scala-library-2.12.10.jar chill-java-0.9.5.jar chill_2.12-0.9.5.jar jackson-module-paranamer-2.10.0.jar jackson-module-scala_2.12-2.10.0.jar jersey-container-servlet-core-2.30.jar jersey-server-2.30.jar json4s-ast_2.12-3.7.0-M5.jar kryo-shaded-4.0.2.jar minlog-1.3.0.jar scala-xml_2.12-1.2.0.jar spark-launcher_2.12-3.1.2.jar spark-network-shuffle_2.12-3.1.2.jar spark-unsafe_2.12-3.1.2.jar xbean-asm7-shaded-4.15.jar [root@dev-spark-slave-171 hive-3.1.2]# cd /data/apps/spark-3.1.2/jars/ [root@dev-spark-slave-171 jars]# cp spark-network-common_2.12-3.1.2.jar spark-core_2.12-3.1.2.jar scala-library-2.12.10.jar chill-java-0.9.5.jar chill_2.12-0.9.5.jar jackson-module-paranamer-2.10.0.jar jackson-module-scala_2.12-2.10.0.jar jersey-container-servlet-core-2.30.jar jersey-server-2.30.jar json4s-ast_2.12-3.7.0-M5.jar kryo-shaded-4.0.2.jar minlog-1.3.0.jar scala-xml_2.12-1.2.0.jar spark-launcher_2.12-3.1.2.jar spark-network-shuffle_2.12-3.1.2.jar spark-unsafe_2.12-3.1.2.jar xbean-asm7-shaded-4.15.jar /data/apps/hive-3.1.2/lib/
將hadoop中的yarn-site.xml、hdfs-site.xml以及Hive的hive-site.xml放入spark的conf中
cp /data/apps/hadoop-3.2.2/etc/hadoop/hdfs-site.xml /data/apps/hadoop-3.2.2/etc/hadoop/yarn-site.xml /data/apps/hive-3.1.2/conf/hive-site.xml /data/apps/spark-3.1.2/conf/
5、上傳至HDFS
為了使各個節點都能夠使用 Spark 引擎進行計算,需要將Spark的jars目錄下所有依賴包上傳至HDFS
[root@dev-spark-slave-171 jars]# cd /data/apps/spark-3.1.2/jars/ [root@dev-spark-slave-171 jars]# hdfs dfs -put * /spark-yarn/jars/
6、將spark目錄與hive中lib目錄,分發到其余機器,讓三台機器配置同步。
rsync-script /data/apps/spark-3.1.2/ rsync-script /data/apps/hive/lib/
7、重啟spark與hive的metastore
stop-all.sh start-all.sh nohup hive --service metastore & nohup hiveserver2 &
8、測試
再次啟動hive,可以看到默認引擎已經改為了spark了。
hive登錄,執行插入的sql
insert into table test.student values(1,'zhouqi',50);
或者聚合計算的sql也行:
select count(1) from test.student;
運行成功后,如下圖:
在yarn上,可以看到這個Application,點擊這個Application ID
點擊ApplicationMaster
在spark上也看到這個任務
當你退出hive的時候,這個Application任務也就隨之結束了,可以查看history。
報錯:
如果執行的過程中報錯:
Failed to execute spark task, with exception 'org.apache.hadoop.hive.ql.metadata.HiveException(Failed to create Spark client for Spark session a103f35a-b3fa-439d-9b1f-d17521f5ff57)'
FAILED: Execution Error, return code 30041 from org.apache.hadoop.hive.ql.exec.spark.SparkTask. Failed to create Spark client for Spark session a103f35a-b3fa-439d-9b1f-d17521f5ff57
查看logs/hive.log,發現如下報錯:
2021-12-02T17:30:56,452 ERROR [16d94a1c-186d-4fa5-8b10-4eff1cc22037 main] spark.SparkTask: Failed to execute spark task, with exception 'org.apache.hadoop.hive.ql.metadata.HiveException(Failed to create Spark client for Spark session a103f35a-b3fa-439d-9b1f-d17521f5ff57)'
org.apache.hadoop.hive.ql.metadata.HiveException: Failed to create Spark client for Spark session a103f35a-b3fa-439d-9b1f-d17521f5ff57
Caused by: java.lang.NoClassDefFoundError: org/apache/spark/SparkConf
Caused by: java.lang.ClassNotFoundException: org.apache.spark.SparkConf
執行上述4、5、6、7步驟之后,這個問題消失,變成了一個新的問題:
Job failed with java.lang.ClassNotFoundException: org.apache.spark.AccumulatorParam
FAILED: Execution Error, return code 3 from org.apache.hadoop.hive.ql.exec.spark.SparkTask. Spark job failed during runtime. Please check stacktrace for the root cause.
經過,網上查找資料,發現是hive與spark的版本不對應導致的。
目前我們使用的版本為:
hive-3.1.2 + spark-3.1.2 (這個版本搭配不行,有問題)
解決方案:
1、重新編譯hive3.1.2,讓其支持spark-3.1.2。參考:https://forsre.cn/oasis/hive3.1.2%E7%BC%96%E8%AF%91%E6%94%AF%E6%8C%81spark3.0.0/
2、切換版本
我們使用hive-2.3.7+spark-2.4.5,試驗成功。
按照官方對應的版本為:https://cwiki.apache.org//confluence/display/Hive/Hive+on+Spark:+Getting+Started
可以按照提示去選擇對應的spark和hive的版本,然后繼續上述步驟操作就可以了。
關於配置Hive on spark,可以參考:https://blog.csdn.net/pucao_cug/article/details/72773564