准备资源:mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar、apache-hive-3.1.2-bin.tar.gz、mysql-connector-java-5.1.37.jar
一、Hive的安装部署
1. 安装MySQL
MySQL建库注意事项:基础字符集使用utf8,排序规则使用utf8_general_ci(有必要的话)
(1) 删除Linux原装的MySQL或者mariaDB
rpm -qa | grep -E -i '(mysql|mariadb)' | xargs -n1 sudo rpm -e --nodeps
(2) 将mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar上传至目录:/opt/software;并将其解包到:/opt/software/mysql-rpms
# 来到software目录下
cd /opt/software/
# 创建目录,用来存放解包出的rpm包
mkdir -p ./mysql-rpms
# 解包
tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C ./mysql-rpms/
(3) 安装解出来的的rpm包
# 如果之前mysql服务正在运行的时候卸载了mysql的话
# mysql会残留文件,删除这些残留文件使用下面命令
# cat /etc/my.cnf | awk -F'=' '/datadir/{print $2}' | xargs sudo rm -rf
# 安装MySQL需要的其他依赖
sudo yum install -y libaio
# mysql rpm包的安装顺序如下
sudo rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
# 安装完之后,初始化数据库
sudo mysqld --initialize --user=mysql
# 启动mysql服务
sudo systemctl start mysqld.service
(4) 重新设置root用户的登录密码
# 获取mysql给root用户分配的临时密码
sudo cat -n /var/log/mysqld.log | grep -E '.+password.*root@localhost:.+' | tr -s ' ' | awk '{gsub(" ","");gsub("\t"," ");print $0}' | sort -nrt ' ' -k1 | awk 'FNR==1{s="root@localhost:";i=index($0,s);print substr($0,i+length(s))}'
# 使用上面得到的密码登录mysql
# mysql的登录方式为:
# mysql -uroot -p (本地登录方式)
# mysql -uroot -p密码 -hlocalhost (远程登录方式)
# mysql安装好之后无法远程登录,先使用本地登录
# 重新设置root用户的登录密码
set password = password("123456");
(5) 其他配置
# 用root用户登录mysql
# 配置mysql允许远程登录
use mysql;
update user set host = "%" where user = "root";
flush privileges;
# 先查看哪些编码不是utf8,filesystem和dir无需关心
show variables like "character%";
# 修改字符编码为utf8
set global character_set_database=utf8;
set global character_set_server=utf8;
# 重新登录mysql
2. 安装Hive
(1) 将apache-hive-3.1.2-bin.tar.gz、mysql-connector-java-5.1.37.jar上传至目录:/opt/software;并将apache-hive-3.1.2-bin.tar.gz解压到:/opt/moudle
# 来到software目录下
cd /opt/software
# 解压
tar -zxvf ./apache-hive-3.1.2-bin.tar.gz -C ../moudle/
# 更名
mv ../moudle/apache-hive-3.1.2-bin ../moudle/hive-3.1.2
(2) 配置环境变量,并使配置的环境变量生效
# 编辑自己创建的环境变量文件
sudo vim /etc/profile.d/my-env.sh
# 添加的环境变量内容如下
#Hive环境变量
export HIVE_HOME=/opt/moudle/hive-3.1.2
export PATH=$PATH:$HIVE_HOME/bin
# 使环境变量生效
source /etc/profile
(3) 删除hive中可能引起冲突的jar包、将jdbc包放入lib目录中
# 删除冲突jar包
rm -rf $HIVE_HOME/lib/log4j-slf4j-impl*
# 放jdbc包
cp /opt/software/mysql-connector-java-5.1.37.jar $HIVE_HOME/lib
(4) 创建hive的配置文件,并向其中写入配置内容($HIVE_HOME/conf/hive-site.xml)
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- jdbc连接的URL -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop101:3306/metastore?useSSL=false</value>
</property>
<!-- jdbc连接的Driver-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- jdbc连接的username-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- jdbc连接的password -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!-- Hive默认在HDFS的工作目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- Hive元数据存储的验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<!-- 元数据存储授权 -->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<!-- 指定由元数据服务代理hive操作mysql中的元数据 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop101:9083</value>
</property>
<!-- 配置使用jdbc方式使用Hive -->
<!-- 指定hiveserver2连接的host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop101</value>
</property>
<!-- 指定hiveserver2连接的端口号 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<!-- 配置使用hive原生方式客户端时,打印表头和库名 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
</configuration>
(5) 配置hive的运行日志存放位置
# 先在hive安装目录下创建logs文件夹,用来存储日志
cd $HIVE_HOME
mkdiri -p logs
# 来到配置目录下
cd $HIVE_HOME/conf
# 修改hive存放配置文件目录下的hive-log4j2.properties.template文件名称为hive-log4j2.properties
mv hive-log4j2.properties.template hive-log4j2.properties
# 修改配置
vim hive-log4j2.properties
# 修改内容为
property.hive.log.dir=/opt/moudle/hive-3.1.2/logs
(6) 配置执行hive脚本时,能够使用的内存大小,默认大小为256M,太小容易导致内存溢出
# 来到存放配置文件的目录下
cd $HIVE_HOME/conf
# 将hive-env.sh.template重名为hive-env.sh
mv hive-env.sh.template hive-env.sh
# 使用Vim打开,并执行替换
vim hive-env.sh
# 进入Vim环境后,摁:,输入以下内容一键替换,配置了1g的内存供使用
%s/# export HADOOP_HEAPSIZE=1024/export HADOOP_HEAPSIZE=1024/
# 退出保存
(7) 初始化元数据库
# 先登录mysql,创建数据库metastore
create database metastore;
# 退出mysql,执行下面的命令
schematool -initSchema -dbType mysql -verbose
3. 启停
(1) 编写启停脚本
# 脚本命名为hive.sh
vim ~/bin/hive.sh
# 下面为脚本内容
#!/bin/bash
function checkMetastore(){
line=$(cat $HIVE_HOME/conf/hive-site.xml | awk '{\
i=index($0, "hive.metastore.uris"); \
if(i!=0){ \
getline; \
print $0 \
} \
}')
line=${line##*:}
port=${line%%</value>}
if [[ $(sudo netstat -nlp | grep $port | wc -l) -eq 0 ]]
then
return 1
else
return 0
fi
}
function checkServer2(){
port=$(cat $HIVE_HOME/conf/hive-site.xml | awk '{\
i=index($0, "hive.server2.thrift.port"); \
if(i!=0){ \
getline; \
print $0 \
} \
}' | grep -E -o '[0-9]+')
if [[ $(sudo netstat -nlp | grep $port | wc -l) -eq 0 ]]
then
return 1
else
return 0
fi
}
function startMetastore(){
checkMetastore
if [[ $? -eq 1 ]]
then
nohup hive --service metastore &>>$HIVE_HOME/logs/metastore.log &
fi
for i in $(seq 1 100)
do
checkMetastore
if [[ $? -eq 0 ]]
then
return 0
fi
sleep 1
done
return 1
}
function startServer2(){
checkServer2
if [[ $? -eq 1 ]]
then
nohup hive --service hiveserver2 &>>$HIVE_HOME/logs/hiveserver2.log &
fi
for i in $(seq 1 100)
do
checkServer2
if [[ $? -eq 0 ]]
then
return 0
fi
sleep 1
done
return 1
}
function main(){
if [[ $# -ne 1 ]]
then
echo "usage: hive.sh (open-hive|open-beeline:stop)"
exit
fi
case $1 in
"open-hive"|"open-beeline")
startMetastore
if [[ $? -eq 0 ]]
then
if [[ $1 == "open-hive" ]]
then
hive
else
startServer2
if [[ $? -eq 0 ]]
then
username=$(\
cat $HADOOP_HOME/etc/hadoop/core-site.xml | \
awk '{ \
i=index($0,"hadoop.http.staticuser.user"); \
if(i!=0){ \
getline; \
begin=index($0,"<value>")+length("<value>"); \
end=index($0,"</value>"); \
print substr($0,begin,end-begin); \
}\
}' \
)
url=$(\
cat $HIVE_HOME/conf/hive-site.xml | \
awk -vORS=':' '{ \
i=match($0,"(hive\.server2\.thrift\.bind\.host|hive\.server2\.thrift\.port)"); \
if(i!=0){ \
getline; \
begin=index($0,"<value>")+length("<value>"); \
end=index($0,"</value>"); \
print substr($0,begin,end-begin); \
} \
}' \
| grep -E -o '.+[^:]')
beeline -u jdbc:hive2://$url -n $username
else
echo "hiveserver2 has something wrong when starting"
fi
fi
else
echo "metastore has something wrong when starting"
fi
;;
"stop")
line=$(cat $HIVE_HOME/conf/hive-site.xml | awk '{\
i=index($0, "hive.metastore.uris"); \
if(i!=0){ \
getline; \
print $0 \
} \
}')
line=${line##*:}
metastorePort=${line%%</value>}
server2Port=$(cat $HIVE_HOME/conf/hive-site.xml | awk '{\
i=index($0, "hive.server2.thrift.port"); \
if(i!=0){ \
getline; \
print $0 \
} \
}' | grep -E -o '[0-9]+')
sudo netstat -nlp | awk -vmetastorePort=$metastorePort -vserver2Port=$server2Port '{ \
i=match($0,"("metastorePort"|"server2Port")"); \
if(i!=0){ \
split($7,arr,"/"); \
print arr[1]; \
} \
}' | xargs -n1 kill -9
;;
*)
echo "usage: hive.sh (open-hive|open-beeline:stop)"
exit
;;
esac
}
main "$*"
# 为脚本添加可执行权限
chmod +x ~/bin/hive.sh
(2) 启动、停止
# 先启动hadoop集群。此处启动的方式是通过自定义的脚本
hadoop-ha.sh start
# 在第一次打开客户端的时候,脚本会负责启动hive相关进程
# 打开hive的原生客户端
# 退出客户端命令:quit;
hive.sh open-hive
# 打开beeline客户端,该客户端使用jdbc的方式操作hive
# 第一次打开花费时间较长,原因是因为hiveserver2服务启动的非常慢
# 退出客户端命令:!quit
hive.sh open-beeline
# 关闭hive所有服务
hive.sh stop
二、Hive的shell操作以及配置
1. Hive的客户端操作(仅针对于原生客户端)
(1) 客户端中操作hdfs文件系统
# 其他命令参照下面命令
# 只是不用写hdfs前缀而已,以及多加一个;
dfs -ls /;
(2) 客户端中操作本地文件系统
# 其他命令参照下面命令
# 只是多加一个!以及一个;
!ls /;
2.Hive命令
(1) 不进入客户端,直接执行指定的sql语句
hive -e "sql 语句"
(2) 不进入客户端,直接执行文件中的sql语句
hive -f 文件路径
3. HIve相关配置
(1) 改配置文件
作用范围:对所有连接永久有效
于hive-site.xml中修改
(2) 启动hive的时候进行配置修改(不是用自定义脚本)
# 作用范围:仅本次连接有效
hive -hiveconf 配置项名=值
(3) 客户端中修改配置
# 作用范围:仅本次连接有效
# 客户端中设置配置项
set 配置项名=值;
# 查看配置项值
set 配置项名;