Hive安装配置
Hive使用前提
hadoop集群(这里用的HA高可用)、mysql、hive
Hive安装
xftp传文件
解压hive的压缩包到/opt/module,并把文件名改成hive-3.1.3
tar -zxvf /opt/software/apache-hive-3.1.3-bin.tar.gz -C /opt/module/
mv apache-hive-3.1.3-bin.tar.gz hive-3.1.3
修改系统环境变量
vim /etc/profile.d/my_env.sh
添加以下内容:
#HIVE_HOME
export HIVE_HOME=/opt/module/hive-3.1.3
export PATH=$PATH:$HIVE_HOME/bin:$PATH:$HIVE_HOME/sbin
source一下:
source /etc/profile
因为hive是一个客户端,所以不用分发到其他机器上。到这里,就不测试默认的derby数据库了,等下装好MySQL直接用MySQL测试
MySQL安装
卸载之前的mariadb/MySQL
不管有没有,先执行以下命令看看:
rpm -qa | grep -i -E mysql\|mariadb
用以下命令卸载:
rpm -qa | grep -i -E mysql\|mariadb | xargs -n1 sudo rpm -e --nodeps
安装过MySQL需要清空原先的所有数据
拿到mysql安装目录
sudo cat /etc/my.cnf
切换root用户,去安装目录干掉所有信息
su root
cd /安装路径
rm -rf *
干掉MySQL依赖
sudo yum remove mysql-libs
安装可能依赖的工具
sudo yum -y install libaio
sudo yum -y install autoconf
在/opt/module下创建mysql_lib,解压MySQL安装包到该目录
module: mkdir mysql_lib
software: tar -xf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C /opt/module/mysql_lib/
安装MySQL依赖
安装顺序:
common------>libs------>libs-compat------>client------>server
cd mysql_lib
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
MySQL配置
启动mysql服务
sudo systemctl start mysqld
查看mysql密码
sudo cat /var/log/mysqld.log | grep password
这里表示pwd为密码
用刚查到的密码登录mysql
mysql -uroot -p'pwd'
先改一个复杂密码,修改密码策略后再改一个简单密码
mysql> set password=password("Qs23=zs32");
mysql> set global validate_password_length=4;
mysql> set global validate_password_policy=0;
mysql> set password=password("123456");
修改Host表,把root的host改为%
use mysql;
update user set host="%" where user="root";
flush privileges;
quit;
配置Hive采用MySQL存元数据
把之前传的jdbc驱动挪到hive的lib目录下
cp /opt/software/mysql-connector-java-5.1.37.jar $HIVE_HOME/lib
在hive-3.1.3/conf下新建hive-site.xml
这个思路跟hadoop自定义core-site.xml差不多,只不过这个需要自己创建文件,hadoop是已经准备好了
vim /opt/module/hive-3.1.3/conf/hive-site.xml
添加:
注意mysql密码和jdbc驱动版本都要一致
<?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://hadoop102: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>
</configuration>
登录mysql,并创建hive元数据库,对该元数据库初始化
元数据库名字必须叫metastore
mysql -uroot -p123456
create database metastore;
quit;
指定hive用mysql存元数据,这一步初始化可以多执行几次,确保初始化成功
bin/schematool -dbType mysql -initSchema -verbose
简单测试
启动hive,简单操作(建表,传数据,查询)
注意前提:hive基于hadoop,所以hadoop集群必须已经是启动的,而hadoop集群之前又配了zookeeper,高可用等
所以如果从零开始启动,步骤是:zk start、myhadoop.sh start、sudo systemctl start mysqld、hive
hive
show databases;
create table stu(id int,name string);
insert into stu values(1,"ss");
select * from stu;
hive常用交互命令
大部分操作的感觉和mysql客户端差不多,不过hive在大数据背景下多数的操作是对文件进行的数据追加以及查询
这里只记录两个命令:
-e 不进入客户端窗口执行hql
hive -e "select * from stu";
-f 执行脚本中的hql
mkdir /opt/module/hive/datas
vim hivef.sql
在hivef.sh中写多个hql
hive -f /opt/module/hive/datas/hivef.sql > /opt/module/hive/datas/hive_result.txt
hive常见属性配置
客户端现实库和表头
在hive-site.xml中加入以下配置:
<property>
<name>hive.cli.print.header</name>
<value>true</value>
<description>Whether to print the names of the columns in query output.</description>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
<description>Whether to include the current database in the Hive prompt.</description>
</property>
更改hive运行日志路径
hive的日志默认放在/tmp/atguigu/hive.log下,不便维护,改到/opt/module/hive/logs
修改/opt/module/hive-3.1.3/conf/hive-log4j2.properties.template 文件名为hive-log4j2.properties
编辑该文件修改以下内容:
property.hive.log.dir=/opt/module/hive/logs
更改hive的JVM堆内存
修改conf下的hive-env.sh.template为hive-env.sh
mv hive-env.sh.template hive-env.sh
编辑该改完名的文件,找到以下内容:
# export HADOOP_HEAPSIZE=1024
把#去掉 数值改为2048,如:
export HADOOP_HEAPSIZE=2048
重启hive
关闭Hadoop虚拟内存检查
先停掉hadoop,myhadoop.sh stop
vim yarn-site.xml
添加:
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
由于改的是hadoop的配置文件,所以需要分发
xsync yarn-site.xml
hive参数配置
hive服务
hiveserver2服务
hadoop的配置:
需要保证core-site.xml中有以下内容,当前用的HA高可用已有,之前的中心化没有
<!—配置所有节点的atguigu用户都可作为代理用户-->
<property>
<name>hadoop.proxyuser.atguigu.hosts</name>
<value>*</value>
</property>
<!—配置atguigu用户能够代理的用户组为任意组-->
<property>
<name>hadoop.proxyuser.atguigu.groups</name>
<value>*</value>
</property>
<!—配置atguigu用户能够代理的用户为任意用户-->
<property>
<name>hadoop.proxyuser.atguigu.users</name>
<value>*</value>
</property>
hive的配置:
hive-site.xml添加:
<!-- 指定hiveserver2连接的host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop102</value>
</property>
<!-- 指定hiveserver2连接的端口号 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<!-- hiveserver2高可用参数,开启此参数可以提高hiveserver2启动速度 -->
<property>
<name>hive.server2.active.passive.ha.enable</name>
<value>true</value>
</property>
测试
启动命令
hive --service hiveserver2
hiveserver2启动完会卡在这
jps查看会多一个runjar进程,就是hiveserver
访问方式一:
beeline客户端访问
再打开一个hadoop102窗口,执行以下命令
bin/beeline -u jdbc:hive2://hadoop102:10000 -n atguigu
访问方式二:
DataGrip访问
metastore服务
在以上配置都完好的前提下,在hive-site.xml中添加
<!-- 指定metastore服务的地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop102:9083</value>
</property>
测试
先启动metastore服务
hive --service metastore
这里也会卡住,然后就可以用cli启hive了
编辑启动脚本(不用背,开箱即用)
vim /home/atguigu/bin/hiveserver
添加:
#!/bin/bash
HIVE_LOG_DIR=$HIVE_HOME/logs
if [ ! -d $HIVE_LOG_DIR ]
then
mkdir -p $HIVE_LOG_DIR
fi
#检查进程是否运行正常,参数1为进程名,参数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 &"
[ -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
添加执行权限
chmod +x /home/atguigu/bin/hiveserver
启动Hive后台服务
hiveserver start
连接客户端
执行写入任务
可以看到yarn上提交的任务
刚刚执行的结果,查询
到这一阶段的总结
当前编写了各种群起脚本,如zookeeper集群的zk start,hadoop(HA)集群的myhadoop.sh start,Hive的hiveservices.sh start,开启三个虚拟机,用Xshell连接三台虚拟机,在hadoop102上执行以上三个命令后,处于zk,ha,hive都在后台运行的状态,这时可以选择用图形化客户端DataGrip也可以用beeline等连接操作hive。
Q.E.D.