1 Hive安裝部署
- 1)把apache-hive-3.1.2-bin.tar.gz上傳到linux目錄下
- 2)解壓apache-hive-3.1.2-bin.tar.gz到/opt/module/目錄下面
[root@node09 06_hive]# tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/module/
- 3)修改apache-hive-3.1.2-bin.tar.gz的名稱為hive
[root@node09 06_hive]# mv /opt/module/apache-hive-3.1.2-bin/ /opt/module/hive
- 4)修改/etc/profile.d/my_env.sh,添加環(huán)境變量
[root@node09 06_hive]# vim /etc/profile.d/my_env.sh
- 5)添加內容
#HIVE_HOME
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/bin
使環(huán)境變量生效或者
[root@node09 06_hive]# source /etc/profile.d/my_env.sh
- 6)解決日志Jar包沖突,進入/opt/module/hive/lib目錄
[root@node09 lib]# mv log4j-slf4j-impl-2.10.0.jar log4j-slf4j-impl-2.10.0.jar.bak
2 Hive元數(shù)據(jù)配置到MySql
2.1 拷貝驅動
將MySQL的JDBC驅動拷貝到Hive的lib目錄下
[root@node09 07_mysql]# cp mysql-connector-java-5.1.48.jar /opt/module/hive/lib/
2.2 配置Metastore到MySql
在$HIVE_HOME/conf目錄下新建hive-site.xml文件
[root@node09 conf]# vim hive-site.xml
添加如下內容
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node09:3306/metastore?useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>000000</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://node09:9083</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node09</value>
</property>
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
</configuration>
3 啟動Hive
3.1 初始化元數(shù)據(jù)庫
- 1)登陸MySQL
[root@node09 conf]# mysql -uroot -p000000
- 2)新建Hive元數(shù)據(jù)庫
mysql> create database metastore;
mysql> quit;
- 3)初始化Hive元數(shù)據(jù)庫
[root@node09 conf]# schematool -initSchema -dbType mysql -verbose
3.2 啟動metastore和hiveserver2
- 1)Hive 2.x以上版本,要先啟動這兩個服務,否則會報錯:
FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient - 2)在/opt/module/hive/bin目錄編寫hive服務啟動腳本
[root@node09 bin]# vim hiveservices.sh
內容如下:
#!/bin/bash
HIVE_LOG_DIR=$HIVE_HOME/logs
mkdir -p $HIVE_LOG_DIR
#檢查進程是否運行正常,參數(shù)1為進程名,參數(shù)2為進程端口
function check_process()
{
pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
echo $pid
[[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
}
function hive_start()
{
metapid=$(check_process HiveMetastore 9083)
cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
cmd=$cmd" sleep 4; hdfs dfsadmin -safemode wait >/dev/null 2>&1"
[ -z "$metapid" ] && eval $cmd || echo "Metastroe服務已啟動"
server2pid=$(check_process HiveServer2 10000)
cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"
[ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服務已啟動"
}
function hive_stop()
{
metapid=$(check_process HiveMetastore 9083)
[ "$metapid" ] && kill $metapid || echo "Metastore服務未啟動"
server2pid=$(check_process HiveServer2 10000)
[ "$server2pid" ] && kill $server2pid || echo "HiveServer2服務未啟動"
}
case $1 in
"start")
hive_start
;;
"stop")
hive_stop
;;
"restart")
hive_stop
sleep 2
hive_start
;;
"status")
check_process HiveMetastore 9083 >/dev/null && echo "Metastore服務運行正常" || echo "Metastore服務運行異常"
check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服務運行正常" || echo "HiveServer2服務運行異常"
;;
*)
echo Invalid Args!
echo 'Usage: '$(basename $0)' start|stop|restart|status'
;;
esac
- 3)添加執(zhí)行權限
[root@node09 bin]# chmod +x hiveservices.sh
- 4)啟動Hive后臺服務
[root@node09 bin]# hiveservices.sh start
- 5)查看Hive后臺服務運行情況
[root@node09 bin]# hiveservices.sh status
Metastore服務運行正常
HiveServer2服務運行異常
- 6)啟動Hive客戶端
[root@node09 bin]# hive
2. Hive on Spark
2.1 編譯
- 1)從官網下載Spark源碼并解壓
下載地址: https://www.apache.org/dyn/closer.lua/spark/spark-2.4.5/spark-2.4.5.tgz - 2)上傳并解壓spark
- 3)進入spark解壓后的目錄
- 4)執(zhí)行編譯命令
[root@node09 spark-2.4.5]# ./dev/make-distribution.sh --name without-hive --tgz -Pyarn -Phadoop-3.1 -Dhadoop.version=3.1.3 -Pparquet-provided -Porc-provided -Phadoop-provided - 5)等待編譯完成,spark-2.4.5-bin-without-hive.tgz為最終文件
2.2 Hive on Spark配置
- 1)解壓spark-2.4.5-bin-without-hive.tgz
[root@node09 1.Spark]# tar -zxf /opt/software/spark-2.4.5-bin-without-hive.tgz -C /opt/module^C
[root@node09 1.Spark]# mv /opt/module/spark-2.4.5-bin-without-hive /opt/module/spark
- 2)配置SPARK_HOME環(huán)境變量
[root@node09 spark]# vim /etc/profile.d/my_env.sh
添加如下內容
export SPARK_HOME=/opt/module/spark
export PATH=$PATH:$SPARK_HOME/bin
source 使其生效
[root@node09 spark]# source /etc/profile.d/my_env.sh
- 3)配置spark運行環(huán)境
[root@node09 spark]# mv /opt/module/spark/conf/spark-env.sh.template /opt/module/spark/conf/spark-env.sh
[root@node09 spark]# vim /opt/module/spark/conf/spark-env.sh
添加如下內容
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
- 4)連接spark jar包到hive,如何hive中已存在則跳過
[root@node09 spark]# ln -s /opt/module/spark/jars/scala-library-2.11.12.jar /opt/module/hive/lib/scala-library-2.11.12.jar
[root@node09 spark]# ln -s /opt/module/spark/jars/spark-core_2.11-2.4.5.jar /opt/module/hive/lib/spark-core_2.11-2.4.5.jar
[root@node09 spark]# ln -s /opt/module/spark/jars/spark-network-common_2.11-2.4.5.jar /opt/module/hive/lib/spark-network-common_2.11-2.4.5.jar
- 5)新建spark配置文件
[root@node09 spark]# vim /opt/module/hive/conf/spark-defaults.conf
添加如下內容
spark.master yarn
spark.master yarn
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hadoop102:8020/spark-history
spark.driver.memory 2g
spark.executor.memory 2g
- 6)在HDFS創(chuàng)建如下路徑
[root@node09 spark]# hadoop fs -mkdir /spark-history
- 7)上傳Spark依賴到HDFS
[root@node09 spark]# hadoop fs -mkdir /spark-jars
[root@node09 spark]# hadoop fs -put /opt/module/spark/jars/* /spark-jars
- 8)修改hive-site.xml
<!--Spark依賴位置-->
<property>
<name>spark.yarn.jars</name>
<value>hdfs://hadoop102:8020/spark-jars/*</value>
</property>
<!--Hive執(zhí)行引擎-->
<property>
<name>hive.execution.engine</name>
<value>spark</value>
</property>
- 9)Hive on Spark 測試
a. 啟動hive客戶端
b. 創(chuàng)建一張測試表
hive (default)> create external table student(id int, name string) location '/student';
c. 通過insert測試效果
hive (default)> insert into table student values(1,'abc');
3 Yarn容量調度器隊列配置
- 1)增加hive隊列
默認Yarn的配置下,容量調度器只有一條Default隊列。在capacity-scheduler.xml中可以配置多條隊列,修改以下屬性,增加hive隊列。
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,hive</value>
<description>
The queues at the this level (root is the root queue).
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>50</value>
<description>
default隊列的容量為50%
</description>
</property>
同時為新加隊列添加必要屬性:
<property>
<name>yarn.scheduler.capacity.root.hive.capacity</name>
<value>50</value>
<description>
hive隊列的容量為50%
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
<value>1</value>
<description>
一個用戶最多能夠獲取該隊列資源容量的比例
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
<value>80</value>
<description>
hive隊列的最大容量
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.state</name>
<value>RUNNING</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>
<value>*</value>
<description>
訪問控制,控制誰可以將任務提交到該隊列
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>
<value>*</value>
<description>
訪問控制,控制誰可以管理(包括提交和取消)該隊列的任務
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>
<value>*</value>
<description>
訪問控制,控制用戶可以提交到該隊列的任務的最大優(yōu)先級
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime</name>
<value>-1</value>
<description>
hive隊列中任務的最大生命時長
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.default-application-lifetime</name>
<value>-1</value>
<description>
default隊列中任務的最大生命時長
</description>
</property>
- 2)配置hive客戶端任務提交到hive隊列
為方便后續(xù)hive客戶端的測試和shell腳本中的任務能同時執(zhí)行,我們將hive客戶端的測試任務提交到hive隊列,讓shell腳本中的任務使用默認值,提交到default隊列。
每次進入hive客戶端時,執(zhí)行以下命令
hive (default)> set mapreduce.job.queuename=hive;