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。