1. Hive引擎簡介
Hive引擎包括:默認(rèn)MR星持、tez碳想、spark
Hive on Spark:Hive既作為存儲元數(shù)據(jù)又負(fù)責(zé)SQL的解析優(yōu)化,語法是HQL語法川陆,執(zhí)行引擎變成了Spark剂习,Spark負(fù)責(zé)采用RDD執(zhí)行。
Spark on Hive : Hive只作為存儲元數(shù)據(jù)书劝,Spark負(fù)責(zé)SQL解析優(yōu)化进倍,語法是Spark SQL語法,Spark負(fù)責(zé)采用RDD執(zhí)行购对。
2. Hive on Spark配置
1)兼容性說明
注意:官網(wǎng)下載的Hive3.1.2和Spark3.0.0默認(rèn)是不兼容的猾昆。因?yàn)镠ive3.1.2支持的Spark版本是2.4.5,所以需要我們重新編譯Hive3.1.2版本骡苞。
編譯步驟:官網(wǎng)下載Hive3.1.2源碼垂蜗,修改pom文件中引用的Spark版本為3.0.0楷扬,如果編譯通過,直接打包獲取jar包贴见。如果報(bào)錯(cuò)烘苹,就根據(jù)提示,修改相關(guān)方法片部,直到不報(bào)錯(cuò)镣衡,打包獲取jar包。
2)在Hive所在節(jié)點(diǎn)部署Spark
如果之前已經(jīng)部署了Spark档悠,則該步驟可以跳過廊鸥,但要檢查SPARK_HOME的環(huán)境變量配置是否正確。
(1)Spark官網(wǎng)下載jar包地址:http://spark.apache.org/downloads.html
(2)上傳并解壓解壓spark-3.0.0-bin-hadoop3.2.tgz
[root@bigdata101 src]# tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz
(3)配置SPARK_HOME環(huán)境變量
[root@bigdata101 src]# vim /root/.bash_profile
添加如下內(nèi)容
# SPARK_HOME
export SPARK_HOME=/usr/local/src/spark-3.0.0-bin-hadoop3.2
export PATH=$PATH:$SPARK_HOME/bin
source 使其生效
[root@bigdata101 spark-3.0.0-bin-hadoop3.2]# source /root/.bash_profile
3)在hive中創(chuàng)建spark配置文件并賦予權(quán)限
[root@bigdata101 spark-3.0.0-bin-hadoop3.2]# cd /usr/local/src/apache-hive-3.1.0-bin/conf/
[root@bigdata101 conf]# vim spark-defaults.conf
添加如下內(nèi)容(在執(zhí)行任務(wù)時(shí)辖所,會根據(jù)如下參數(shù)執(zhí)行)
spark.master yarn
spark.eventLog.enabled true
spark.eventLog.dir hdfs://bigdata101:9000/spark-history
spark.executor.memory 1g
spark.driver.memory 1g
[root@bigdata101 conf]# chmod 777 spark-defaults.conf
在HDFS創(chuàng)建如下路徑惰说,用于存儲歷史日志
[root@bigdata101 apache-hive-3.1.0-bin]# hadoop fs -mkdir /spark-history
4)向HDFS上傳Spark純凈版jar包
說明1:由于Spark3.0.0非純凈版默認(rèn)支持的是hive2.3.7版本,直接使用會和安裝的Hive3.1.2出現(xiàn)兼容性問題缘回。所以采用Spark純凈版jar包吆视,不包含hadoop和hive相關(guān)依賴,避免沖突酥宴。
說明2:Hive任務(wù)最終由Spark來執(zhí)行啦吧,Spark任務(wù)資源分配由Yarn來調(diào)度,該任務(wù)有可能被分配到集群的任何一個(gè)節(jié)點(diǎn)幅虑。所以需要將Spark的依賴上傳到HDFS集群路徑丰滑,這樣集群中任何一個(gè)節(jié)點(diǎn)都能獲取到。
(1)上傳并解壓spark-3.0.0-bin-without-hadoop.tgz
[root@bigdata101 src]# tar -zxvf spark-3.0.0-bin-without-hadoop.tgz
(2)上傳Spark純凈版jar包到HDFS
[root@bigdata101 src]# hadoop fs -mkdir /spark-jars
[root@bigdata101 src]# hadoop fs -put spark-3.0.0-bin-without-hadoop/jars/* /spark-jars
5)修改hive-site.xml文件
[root@bigdata101 src]# vim apache-hive-3.1.0-bin/conf/hive-site.xml
添加如下內(nèi)容
<!--Spark依賴位置(注意:端口號9000必須和namenode的端口號一致)-->
<property>
<name>spark.yarn.jars</name>
<value>hdfs://bigdata101:9000/spark-jars/*</value>
</property>
<!--Hive執(zhí)行引擎-->
<property>
<name>hive.execution.engine</name>
<value>spark</value>
</property>
6)修改spark-env.sh文件
[root@bigdata101 conf]# pwd
/usr/local/src/spark-3.0.0-bin-hadoop3.2/conf
[root@bigdata101 conf]# mv spark-env.sh.template spark-env.sh
[root@bigdata101 conf]# vim spark-env.sh
然后在該文件中添加:
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
3. Hive on Spark測試
(1)啟動hive客戶端
[root@bigdata101 spark-3.0.0-bin-hadoop3.2]# hive
(2)創(chuàng)建一張測試表
hive (default)> create table student(id int, name string);
(3)通過insert測試效果
hive (default)> insert into table student values(1,'abc');
填坑筆記1:spark客戶端連接失敗
報(bào)錯(cuò)詳細(xì)日志如下:
解決方法:在hive-site.xml中添加如下屬性增加連接客戶端時(shí)長
[root@bigdata101 ~]# cd /usr/local/src/apache-hive-3.1.2-bin
[root@bigdata101 apache-hive-3.1.2-bin]# vim conf/hive-site.xml
<property>
<name>hive.spark.client.connect.timeout</name>
<value>90000ms</value>
</property>
填坑筆記2:執(zhí)行數(shù)倉插入數(shù)據(jù)語句報(bào)錯(cuò)
報(bào)錯(cuò)具體日志如下:
報(bào)錯(cuò)原因:
執(zhí)行hive語句倒庵,這個(gè)時(shí)候在hive的目錄下回產(chǎn)生很多staging_hive文件褒墨,而且是操作哪個(gè)表,就在哪個(gè)表中產(chǎn)生擎宝。hive也會產(chǎn)生staging_hive郁妈,但是hive產(chǎn)生后會被移除,而spark執(zhí)行引擎不會移除绍申,所以我們需要手動處理這種情況噩咪。
解決方法:在hive-site.xml中修改如下屬性
修改前:
<property>
<name>hive.exec.stagingdir</name>
<value>hive-staging</value>
</property>
修改后:
<property>
<name>hive.exec.stagingdir</name>
<value>/tmp/staging/hive-staging</value>
</property>
寫shell腳本,定時(shí)去/tmp/hive/staging/staging目錄下清除文件极阅,注意胃碾,清除文件一定要清除昨天的,今天產(chǎn)生的有可能正好在用筋搏,如果被移除了仆百,則會報(bào)錯(cuò)