1 Hive下载
Hive 官网地址:https://hive.apache.org/
下载地址:http://www.apache.org/dyn/closer.cgi/hive/
2 Hive安装与启动
2.1 Hive安装
把安装文件apache-hive-3.1.2-bin.tar.gz上传到master节点的/opt/software目
录下,执行以下命令把安装文件解压到/opt/app目录中
cd /export/software
tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /export/server
进入/opt/app目录,为目录apache-hive-3.1.2-bin建立软件链接
即输入hive就相当于输入apache-hive-3.1.2-bin,方便以后的shell命令
cd /export/server
ln -s apache-hive-3.1.2-bin hive
用vi命令编辑/etc/profile文件,添加环境变量
#HIVE_HOME
export HIVE_HOME=/export/server/apache-hive-3.1.2-bin
export PATH=$PATH:$HIVE_HOME/bin
运行source命令,让修改后的配置文件生效
source /etc/profile
解决日志jar包冲突:改名称
mv -T $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.bak
初始化元数据库
schematool -dbType derby -initSchema
报以下错误
Exception in thread "main" java.lang.NoSuchMethodError:
com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
原因是hadoop和hive的两个guava.jar版本不一致,两个jar位置分别位于下面两个目录:
/export/server/hive/lib/guava-19.0.jar
/export/server/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar
解决办法:
删除低版本的那个,将高版本的复制到低版本目录下。
cd /export/server/hive/lib
rm -f guava-19.0.jar
cp /export/server/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar /export/server/hive/lib
再次运行schematool -dbType derby -initSchema,即可成功初始化元数据库。
2.2 Hive启动
2.2.1 启动Hive
在命令窗口中输入以下命令启动hive:
hive
如果发生下面的报错
hive启动时报Exception in thread "main" java.lang.RuntimeException: java.net.ConnectExcepti on: Call From hadoop101/192.168.2.101 to hadoop101:9820 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
额,你忘了启动hadoop集群了,hive的运行是基于hadoop集群的
2.2.2 退出Hive
exit;
2.2.3 查看Hive的启动日志
Hive的日志存放在“/tmp/登录用户名”目录下,以root用户登录,则存放在/tmp/root目录下。
3 元数据库更换为MySQL
默认情况下,Hive 元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的测试。实际生产环境中不适用, 为了支持多用户会话,则需要一个独立的元数据库,使用 MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持。内置的derby主要问题是并发性能很差,可以理解为单线程操作。
3.1 检查是否已安装MySQL
rpm -qa|grep mariadb
如果查找到内容则要卸载mariadb,没有查找到内容则可以开始安装mysql。
rpm -e --nodeps mariadb-libs
3.2 安装MySQL
注意一行一行的执行命令
cd /export/software/mysql
yum install -y numactl libaio net-tools
rpm -ivh mysql-community-common-8.0.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.19-1.el7.x86_64.rpm
3.3 修改MySQL默认密码
输入以命令运行MySQL
systemctl start mysqld.service # 启动MySQL
systemctl enable mysqld.service # 开机自启动
查找MySQL的默认密码
grep 'temporary password' /var/log/mysqld.log
用查找到的密码登录mysql
mysql -uroot -p'%:D%oc#1r:u.'
mysql登录成功后,执行以下命令修改root用户的登录密码为"%:D%oc#1r:u.",
让密码永不过期,
user 表中的 root 用户允许任意 ip 连接。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Big_data20';
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Big_data20' PASSWORD EXPIRE NEVER;
update mysql.user set host='%' where user='root';
flush privileges;
3.4 配置Hive元数据保存到MySQL
3.4.1 下载 MySQL JDBC 驱动程序
为了让 Hive 能够连接到 MySQL 数据库,需要下载 MySQL JDBC 驱动程序。可以到MySQL 官网(
http://www.mysql.com/downloads/connector/j)下载mysql_connector-java-8.0.23.tar.gz。
3.4.2 安装JDBC驱动程序
从下载好的压缩包中解压出mysql-connector-java-8.0.23.jar,复制到/exprot/server/hive/lib 目录中。
cd /export/server/mysql
cp mysql-connector-java-8.0.23.jar /export/server/hive/lib
3.4.3 在$HIVE_HOME/conf 目录下新建 hive-site.xml 文件
vi $HIVE_HOME/conf/hive-site.xml
添加如下内容
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" target="_blank" rel="external nofollow" ?>
<configuration>
<!-- jdbc 连接的 URL -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node7:3306/metastore?createDatabaseIfNotExist=true&useUnicode=true&characte
rEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8</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>Big_data20</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 默认在 HDFS 的工作目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
3.4.5登录MySQL
mysql -uroot -p'Big_data20'
解决中文乱码的问题,在/etc/my.cnf的末尾添加发下代码:
character-set-server = utf8
collation-server = utf8_general_ci
init_connect='SET NAMES utf8'
[client]
default-character-set=utf8
若metastore数据库已创建,需要执行发下命令,若未创建可以忽略:
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
alter table INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
先登入mysql,后然创建Hive元数据库
create database metastore;
quit;
3.4.5 初始化Hive元数据库
schematool -initSchema -dbType mysql -verbose
3.4.6 再次启动Hive
hive
3.4.7测试Hive
在Hive命令行窗口中输入以下命令
create table test (name string);
insert into test values('john');
select * from test;
注意:insert语句执行会很慢,时间可能会有几十秒,这是正常的
在HDFS上查看创建的表
4 使用元数据服务的方式访问 Hive
4.1 metastore三种配置方式
4.1.1内嵌模式
内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。数据库和Metastore服务都嵌入在主Hive Server进程中。这个是默认的,配置简单,但是一次只能有一个进程可以连接到数据库,适用于用来实验,不适用于生产环境。解压hive安装包 bin/hive 启动即可使用
缺点:不同路径启动hive,每一个hive拥有一套自己的元数据,无法共享。
4.1.2本地模式
本地模式采用外部数据库来存储元数据,目前支持的数据库有:MySQL、Postgres、Oracle、MS SQL Server。本地模式不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。也就是说当你启动一个hive 服务,里面默认会帮我们启动一个metastore服务。hive根据hive.metastore.uris 参数值来判断,如果为空,则为本地模式。本地模式下hive的配置主需要指定mysql的相关信息。
缺点:每启动一次hive服务,都内置启动了一个metastore。
4.1.3远程模式
远程模式下,需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。远程模式的metastore服务和hive运行在不同的进程里。在生产环境中,建议用远程模式来配置Hive Metastore。在这种情况下,其他依赖hive的软件都可以通过Metastore访问hive。远程模式下,需要配置hive.metastore.uris 参数来指定metastore服务运行的机器ip和端口,并且需要单独手动启动metastore服务。
4.2 远程模式部署hive的metastore服务
4.2.1 使用Hive CLI连接metastore服务
4.2.1.1 在 hive-site.xml 文件中添加如下配置信息
<!-- 指定存储元数据要连接的地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://node7:9083</value>
</property>
4.2.1.2启动 metastore服务
前台启动:
hive --service metastore
注意: 该启动方式下,进程会一直占用shell终端前台。如果ctrl+c结束进程,则hive metastore服务也会同时关闭。
后台启动:
nohup hive --service metastore &
后台启动的情况下,如果想关闭metastore服务,使用jps查看进程,kill -9 进程号即可。
4.2.1.3启动Hive
前台启动需要打开一个新命令行窗口,后台启动不需要打开一个新的命令行窗口。用hive命令启动hive。
4.2.2 使用BeeLine CLI连接metastore服务
4.2.2.1在 hive-site.xml 文件中添加如下配置信息
<!-- 指定存储元数据要连接的地址 -->
<!-- 指定 hiveserver2 连接的 host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node7</value>
</property>
<!-- 指定 hiveserver2 连接的端口号 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
4.2.2.2 启动metastore服务
nohup hive --service metastore &
4.2.2.3 启动 hiveserver2
nohup hive --service hiveserver2 &
4.2.2.4 启动 beeline 客户端(需要多等待一会)
beeline -u 'jdbc:hive2://node7:10000' -n root
若出现以下错误
User: root is not allowed to impersonate root (state=08S01,code=0)
在/export/server/hadoop-3.1.4/etc/hadoop/core-site.xml 中添加如下部分,重启服务即可:
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
重启hadoop、metastore服务、hiveserver2服务,再次启动beeline 客户端就可以连接成功了。
4.2.3 编写Hive启动脚本
以上的方式启动、停止hive比较麻烦,下面编写一个Hive启动/停止脚本hive_script.sh,用于自动启停hive。
cd /export/server/hive/bin
vim hive-script.sh
脚本内容如下:
#!/bin/bash
if [ $# -lt 1 ]
then
echo "Input No Args!"
echo "请输入 $(basename $0) start/stop/restart/status"
exit;
fi
HIVE_LOG_DIR=$HIVE_HOME/logs
if [ ! -d $HIVE_LOG_DIR ]
then
mkdir -p $HIVE_LOG_DIR
fi
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 3
hive_start
;;
"status")
check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"
check_process HiveServer2 10000 >/dev/null && echo "HiveServer2 服务运行正常" || echo "HiveServer2服务运行异常"
;;
*)
echo "Input Args Error!"
echo "请输入 $(basename $0) start/stop/restart/status"
;;
esac
保存脚本后,为脚本添加运行权限
chmod +x hive-script.sh
用脚本启动、停止、重启、检测运行状态的命令分别为:
hive-script.sh start
hive-script.sh stop
hive-script.sh restart
hive-script.sh status
注意:hive --service hiveserver2启动较慢,启动后在用hive-script.sh status检测服务状态时要多等一会儿,否则报服务运行异常。
hive-script.sh脚本只是启动了metastore服务和hiveserver2服务,要运行hive命令还需要启beeline 客户端。
beeline -u 'jdbc:hive2://node7:10000' -n root
关于hive异常:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStor
可能是你使用了metastore的远程模式,但是没有启动metastore服务导致,用通过重启metastore服务解决。
3台虚拟机重启后需要运行以下命令,重启hadoop和hive服务:
1. start-all.sh #启动hadoop服务
2. hive-script.sh start #启动metastore服务和HiveServer2服务
3. hive #启动hive
或运行beeline -u 'jdbc:hive2://node7:10000' -n root启动beeline客户端