准备工作
下载Hive
Hive 1.x 和 Hadoop 1.x 对应;
Hive 2.x 和 Hadoop 2.x 对应;
Hive 3.x 和 Hadoop 3.x 对应;
到官网或者镜像中心下载对应版本的Hive。例如:apache-hive-3.1.3-bin.tar.gz
安装
解压
将 tar包上传到hadoop服务器,例如 hadoop102上的 /opt/software
文件夹中。
解压到/opt/module
文件夹:
tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /opt/module/
如果感觉解压后的文件名比较长,可以进行重命名:
cd /opt/module
mv apache-hive-3.1.3-bin/ hive-3.1.3
配置环境变量
在/etc/profile.d/my_env.sh
中加入以下环境变量:
# HIVE_HOME
export HIVE_HOME=/opt/module/hive-3.1.3
export PATH=$PATH:$HIVE_HOME/bin
解决日志 jar 包冲突
移除HIVE的日志jar包:
mv $HIVE_HOME/lib/log4j-slf4j-impl-2.17.1.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.17.1.bak
不需要集群部署
因为Hive只是一个将HQL语句转换成MapReduce的工具,本质上也还是一个执行MapReduce任务的客户端,就和我们运行一个java程序一样,所以不存在集群化部署。
启动
初始化元数据库
当不修改配置时,hive默认使用的是自带的 derby 数据库。
启动前,需要先初始化元数据库:
bin/schematool -dbType derby -initSchema
如果执行报以下错误:
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
at org.apache.hadoop.conf.Configuration.set(Configuration.java:1357)
at org.apache.hadoop.conf.Configuration.set(Configuration.java:1338)
at org.apache.hadoop.mapred.JobConf.setJar(JobConf.java:536)
at org.apache.hadoop.mapred.JobConf.setJarByClass(JobConf.java:554)
at org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:448)
at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5144)
at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5107)
at org.apache.hive.beeline.HiveSchemaTool.<init>(HiveSchemaTool.java:96)
at org.apache.hive.beeline.HiveSchemaTool.main(HiveSchemaTool.java:1473)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
at org.apache.hadoop.util.RunJar.main(RunJar.java:236)
则可能是 hive 内依赖的 guava.jar 和 hadoop内的 guava.jar版本不一致造成的。
检查方法:
- 查看
$HIVE_HOME/lib
下的guava-xxx.jar
(hive 3.1.3自带的是guava-19.0.jar
) - 查看
$HADOOP_HOME/share/hadoop/common/lib
下的guava-xxx.jar
(hadoop 3.2.3自带的是guava-27.0-jre.jar
)
将hive中低版本的guava的jar包移除,更换成 hadoop 的高版本 guava 包:
mv $HIVE_HOME/lib/guava-19.0.jar $HIVE_HOME/lib/guava-19.0.bak
cp $HADOOP_HOME/share/hadoop/common/lib/guava-27.0-jre.jar $HIVE_HOME/lib/
然后重新执行初始化元数据命令即可。
初始化元数据库成功后,会在hive目录下生成:derby.log
日志文件、metastore_db
元数据库信息文件夹。
启动hive客户端
使用命令启动hive客户端:
bin/hive
查看启动日志,默认的日志保存位置为:/tmp/用户名/hive.log
。
启动后,会出现一个警告:
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
基于MR的Hive在 hive 2时已经过时,将来版本中可能会被弃用,考虑使用其他引擎(例如spark、tez),或者使用 hive 1.x。
简单的命令
HQL命令类似于Mysql的SQL:
-- 查看所有数据库
show databases;
-- 查看所有表
show tables;
-- 创建表
create table test(id string); -- 字符串是string,整数是int,类似java的类型
-- 插入一条数据
insert into test values('aaa'); -- 该语句执行后,会被转换成一个MapReduce任务
默认生成的test文件为:/user/hive/warehouse/test/000000_0
。该路径也可以自定义
更换元数据库
derby数据库的弊端
hive默认使用的是自带的derby数据库,该数据库使用起来不方便:
- 不能连接进去查看具体的内部数据
- 不支持多用户。当启动两个及以上的hive客户端时,就会报错
所以需要将hive的元数据库修改为MySQL。
安装Mysql数据库
下载:
到mysql官网下载对应Linux版本的Mysql 5.7安装包:mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
将安装包上传到 hadoop102 的/opt/software/
目录并解压:
# 解压完的几个文件还是安装包,所以直接解压到 /opt/software 文件夹即可
tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
卸载系统自带的Mysql:
# 检查当前系统是否已经自带了Mysql
rpm -qa | grep mariadb
# 如果已经自带了Mysql,例如mariadb-libs-5.5.56-2.el7.x86_64,则先进行卸载
sudo rpm -e --nodeps mariadb-libs
# 卸载完重新检查
rpm -qa | grep mariadb
安装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
如果出现检测mysql-community-libs-8.0.29-1.el7.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY 安装命令后面加 —nodeps —force 例如 rpm -ivh mysql-community-libs-8.0.16-2.el7.x86_64.rpm —nodeps —force
如果linux是最小版本的,可能会缺少libaio
等依赖,根据报错安装相关依赖即可:
# 如果报错缺少libaio依赖,则安装依赖即可。没报错则无需安装
yum install -y libaio
删除datadir
中的内容:
查看文件/etc/my.cnf
文件中的 datadir
的值,默认是/var/lib/mysql
。
进入该路径,查看该路径下是否有内容。如果有则清空该文件夹下的内容,如果没有则无需理会。
初始化数据库:
sudo mysqld --initialize --user=mysql
启动Mysql服务:
sudo systemctl start mysqld
mysqld
服务默认就是开机自启,无需再配置开机自启。
查看临时生成的root用户的密码:
# 查看日志文件中生成root用户的临时密码 A temporary password is generated for root@localhost:
sudo cat /var/log/mysqld.log
使用该密码登录数据库:
mysql -uroot -p
登入数据库后,修改root用户的密码,否则执行其他操作可能会报错:
-- set password = password("新密码");
set password = password("root");
修改Mysql库下的user表中的root用户允许任意ip连接:
update mysql.user set host='%' where user='root';
flush privileges;
更换为Mysql数据库
添加jdbc驱动:
从Maven中央仓库下载mysql驱动包:mysql-connector-java-5.1.37.jar
将mysql的jdbc驱动包放到$HIVE_HOME/lib
目录下。
添加配置文件:
hive的配置文件位于$HIVE_HOME/conf
目录下,该目录下自带了一些.template
的模板样例。
与Hadoop的xxx-site.xml
配置文件类似,Hive中用户自定义的配置文件叫hive-site.xml
。
在$HIVE_HOME/conf
下新建hive-site.xml
:
内容可以参考
hive-default.xml.template
模板
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop102:3306/hive?useSSL=false</value>
<description>jdbc连接的URL</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>jdbc驱动类</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>用户名</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
<description>密码</description>
</property>
<!-- 下面两处的校验是为了derby的校验。如果换成了Mysql数据库,都需要设置成false,否则hive会启动失败 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
<description>hive元数据存储版本的验证</description>
</property>
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
<description>hive元数据存储授权</description>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>Hive表数据在HDFS的默认存储的工作目录</description>
</property>
</configuration>
初始化Mysql元数据库
登录Mysql,根据hive-site.xml
配置的数据库实例名,在Mysql中创建Hive的元数据库:
create database hive;
使用hive的schematool
工具初始化hive元数据库:
/opt/module/hive-3.1.3/bin/schematool -initSchema -dbType mysql -verbose
再次启动hive:
# 启动hive进行查看
bin/hive
Hive向外提供服务
Hive安装之后,可以在本机进行使用,但是还无法让第三方客户端连接。
如果想在Java程序等第三方客户端中连接使用Hive服务,则还需开启Hive的对应服务。
使用元数据服务的方式访问Hive
- 在
hive-site.xml
文件中添加如下信息:<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop102:9083</value>
<description>指定存储元数据要连接的地址</description>
</property>
- 启动
metastore
服务:hive --service metastore
- 启动hive
bin/hive
配置了metastore服务后,第三方工具就可以通过该服务来连接本机的hive。
注意事项:
如果在hive-site.xml
中配置了metastore
服务,那么就必须启动该服务才能使用hive,否则会报错。
使用JDBC方式访问Hive
- 在
hive-site.xml
中添加如下信息:<!-- 需要先配置metastore服务的:hive.metastore.uris -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop102</value>
<description>指定hive server2连接的host</description>
</property>
<property>
<name>hive.server2.thrift.bind.port</name>
<value>10000</value>
<description>指定hive server2连接端口号</description>
</property>
- 启动hive server2:
# 需要先启动metastore服务 hive --service metastore
hive --service hiveserver2
# 也可以使用 bin/hiveserver2命令启动
- 启动 beeline 客户端:(hiveserver2服务启动的比较慢,需要等待一会儿才能连上)
# beeline -u jdbc地址 -n 用户名
# 不需要密码,hiveserver2没有密码
bin/beeline -u jdbc:hive2://hadoop102:10000 -n tengyer
- 连接上之后,就可以正常的进行查询:
show tables;
select * from test;
- hiveserver2启动后,会向外暴露一个WebUI服务,端口号是 10002,可以用浏览器进行访问:http://hadoop102:10002/
注意事项:
使用 hiveserver2时,底层会去连接 metastore 服务,所以除了要启动 hiveserver2服务外,还需要启动 metastore服务。
使用beeline连接hiveserver2时,如果报错:
WARN jdbc.HiveConnection: Failed to connect to hadoop102:10000
Error: Could not open client transport with JDBC Uri: jdbc:hive2://hadoop102:10000: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: tengyer is not allowed to impersonate tengyer (state=08S01,code=0)
需要在 Hadoop 的core-site.xml
中添加配置:
<!-- 任意地址都可以使用hadoop 的超级代理用户tengyer连接(hive需要用) -->
<property>
<name>hadoop.proxyuser.tengyer.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.tengyer.groups</name>
<value>*</value>
</property>
配置完需要重启Hadoop。
编写Hive服务启动脚本
hive --service xxxx
开启的服务或者bin/hiveserver2
启动的服务默认是在前台运行的,需要保证窗口不关闭,所以需要改为使用 nohup
启动。
nohup hive --service metastore 2>&1 &
nohup hive --service hiveserver2 2>&1 &
为了方便使用,可以编写成脚本,来管理服务的启动和关闭:~/bin/hiveservices.sh
#!/bin/bash
HIVE_LOG_DIR=/opt/module/hive-3.1.3/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 /opt/module/hive-3.1.3/bin/hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
[ -z "$metapid" ] && eval $cmd || echo "Metastore 服务已启动"
server2pid=$(check_process HiveServer2 10000)
cmd="nohup /opt/module/hive-3.1.3/bin/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
Hive 交互命令
不进入hive交互窗口执行sql
Hive提供的交互命令可以通过-help
进行查看:
hive -help
使用-e
直接执行sql,不需要再进入hive提示符中。就可以把sql写到shell脚本中进行执行:
# 后面可以执行多个sql语句
hive -e "select * from test;"
使用-f
执行sql文件:
# sql文件中可以带有多个sql语句
hive -v hive.sql
查看在hive中输入的所有历史命令:
cat ~/.hivehistory
hive交互窗口
hive窗口进入:
bin/hive
hive窗口退出:
# exit或quit
exit;
在hive交互窗口中查看 HDFS 文件系统内容:
# 在hive交互窗口中,可以直接查看hdfs文件系统内容
dfs -fs /;
在hive交互窗口中执行Linux本地的命令:
在命令前加上
!
即可执行Linux命令
!ls;
!clear;
静默模式:
只打印结果,不打印中间转换成MR的调试信息
hive -S
Hive 其他常用属性配置
Hive运行日志信息配置
Hive的log默认存放在 /tmp/用户名/hive.log
文件中。
在$HIVE_HOME/conf
下新建hive-log4j2.properties
配置文件,修改hive的日志配置信息:
内容可以复制
hive-log4j2.properties.template
模板
# 修改配置文件中hive的日志文件夹路径配置
property.hive.log.dir=/opt/module/hive/logs
打印当前所处的数据库和表头
通过bin/hive
进入Hive交互窗口后,如果使用use xxx;
切换了数据库实例,不方便看出来。使用select
查询时也没有表头列名。
可以在hive-site.xml
中加入如下两个配置:
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
参数配置方式
查看当前所有配置信息。在Hive的交互窗口中使用set;
命令查看:
set;
参数配置的三种方式:
- 使用配置文件配置
默认的配置文件为:hive-default.xml
。用户自定义的配置文件为:hive-site.xml
用户自定义配置会覆盖默认配置。另外,Hive也会读入Hadoop的配置项,因为Hiva是作为Hadoop的客户端启动的,Hive的配置会覆盖Hadoop的配置。配置文件的设定对本机启动的所有Hive进程都有效。 - 命令行参数方式配置
启动Hive时,可以在命令行添加-hiveconf param=value
来设定参数。
该配置参数只对本地hive启动有效。
例如:hive -hiveconf mapred.reduce.tasks=10;
- 参数声明方式
可以在HQL中使用SET
关键字设定参数。
例如:set mapred.reduce.tasks=100;
优先级:配置文件 < 命令行参数 < 参数声明。
有些系统级别的参数(例如 log4j 相关设定),必须使用前两种方式。
使用DBeaver等工具连接Hive
当Hive启动 jdbc 服务后,便可以使用 DBeaver 等第三方工具连接Hive。
Hive的 jdbc 驱动jar位于:$HIVE_HOME/jdbc文件夹下,如:hive-jdbc-3.1.3-standalone.jar
配置数据库连接:
主机:hadoop102,
端口:10000(配置的jdbc服务的端口)
数据库/默认:default(根据实际情况选择对应的数据库实例名)
用户名:kaixin(即hadoop的core-site.xml中配置的代理用户名)
密码:空
最终生成的JDBC url为:jdbc:hive2://hadoop102:10000/default