一, Hive概述
1. 什么是Hive
[概念]
Hive: 由FaceBookc开源用于解决海量结构化日志的数据统计工具.
- Hive是基于Hadoop的一个数据仓库工具, 可以将结构化的数据文件
映射 为一张表, 并提供类SQL(Hive SQL)查询 功能. - Hive处理的
数据存储在HDFS . - Hive的本质是
将SQL语句转换为MapReduce任务运行 , 使得不熟悉MapReduce的用户也能很方便利用HQL 处理和计算HDFS上的结构化数据,适用于离线的批量数据计算.
[本质]

Hive 依赖于 HDFS 存储数据,Hive 将 HQL 转换成 MapReduce 执行,所以说 Hive 是基于 Hadoop 的一个数据仓库工具,实质就是一款基于 HDFS 的 MapReduce 计算框架,对存储在 HDFS 中的数据进行分析和管理
2. Hive 优缺点
[优点]
[缺点]
3. Hive 架构
二, Hive安装
2.1 下载地址和文档地址
Hive-3.1.2 安装包下载 Hive官方文档地址
2.2 安装Hive
-
把下载的安装包apache-hive-3.1.2-bin.tar.gz上传到/opt/software 目录中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zbupgr5N-1627818272700)(2021-07-31-11-23-12.png)] -
使用tar命令, 解压安装包到/opt/module/ 目录中, 然后改名为hive-3.1.2 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wgfrPrtW-1627818272702)(2021-07-31-11-24-42.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X4X20ECl-1627818272704)(2021-07-31-11-25-37.png)] -
添加相应的环境变量, 千万不要忘了source /etc/profile 进行生效噢! [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EwBhY0to-1627818272706)(2021-07-31-11-31-47.png)] -
解决日志jar包冲突 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ks7mKzkW-1627818272707)(2021-07-31-11-36-47.png)] -
初始化元数据库
[win10@bigdata01 hive-3.1.2]$ bin/schematool -dbType derby -initSchema --verbose
- 成功执行后最终结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y5mktVyJ-1627818272708)(2021-07-31-15-25-20.png)]
初始化元数据可能会碰到的错误
[错误1-java.langNoSuchMethodError]
Exception in thread “main” java.langNoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bPD11f52-1627818272709)(2021-07-31-14-34-18.png)]
- 问题原因:
hadoop安装目录lib库目录下的Guava-版本号-jre.jar包 与 hive的lib库中的 Guava-版本号.jar包 版本不一致导致的,
- Guava-xx.jar包 在hadoop安装目录下的路径是/hadoop安装路径/share/hadoop/common/lib
- 在hive安装目录下的路径是: /hive安装目录/lib
- 解决办法:
用hadoop中的这个Guava-版本号-jre.jar 替换掉hive路径下的jar包, 名字改成跟hive一致的形式, 即Guava-版本号.jar (当然版本号要与hadoop的一直即可.)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mS5kpyeL-1627818272710)(2021-07-31-14-47-17.png)] 如下图, 上面是hive原有的jar包, 下面是从hadoop目录复制过来的jar包, 我们做以下修改即可: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wKbYQmOy-1627818272711)(2021-07-31-14-48-29.png)]
[错误2-Error: DDL is not permitted for a read-only connection, user or database.]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-li7geKu5-1627818272712)(2021-07-31-14-54-44.png)]
- 问题原因:
/metastore_db目录下文件属于的用户名和组名有问题 , 在当前用户中没有相关的读写权限, 之所以出现这种情况可能是因为在初始化元数据库的时候, 使用了root用户去启动(sudo 提权等等), 造成derby数据库生成的文件属于的用户名和组都成了root. - 解决办法, 直接重装最好, 但是也能通过找到Hive安装目录下的metastore.db目录, 更改为当前用户即可, 当然还要删除 .lck文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jhlb6pq0-1627818272713)(2021-07-31-15-06-30.png)]
2.3 启动和使用Hive
- 启动Hive
bin/hive
可能会出现的错误: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HtWbnPf5-1627818273323)(2021-07-31-15-37-08.png)]
别忘了启动你的hadoop集群噢, 因为hive需要存储和读取hdfs中的数据!
- Hive的简单使用
- 创建数据库test;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ymUFoB4h-1627818272714)(2021-07-31-16-00-39.png)] - 往test数据库添加新表testtable, 并查看表结构;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hU7qDaQf-1627818272715)(2021-07-31-15-59-45.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a8sbFe8f-1627818272716)(2021-07-31-16-01-10.png)] - 往表中添加一条数据;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TJ29xu9A-1627818272717)(2021-07-31-16-06-08.png)]
可以看到在插入数据到表的时候, 数据经过了Map-Reduce过程, 之后肯定是被存放到了HDFS中.
- 查看表中的数据
- 从hive客户端查看:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ArGLGQgY-1627818272718)(2021-07-31-16-05-18.png)] - 直接查看HDFS目录中的数据.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xZvkQf4C-1627818272719)(2021-07-31-16-08-33.png)]
- 如何实时查看 Hive的运行日志? 为什么我们需要替换掉元数据库 Derby?
- 在xshell单独开一个终端, 并实时监控日志:
tail -f /tmp/win10(linux主句用户名)/hive.log , 同时我们再开一个终端去启动hive bin/hive , - 此时查看log日志变化, 会疯狂报错, 结束后从日志末尾往上三分之一处, 会出现这么一句话:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8PfbE19D-1627818272720)(2021-07-31-16-45-38.png)] - 这句话是说已经有别的Derby实例在使用数据库了, 即Derby同一时刻只能由一个用户使用.
- 综上我们可以知道在Hive中元数据库 Derby被替换的原因:
-
Derby数据库不支持并发,也就是只支持单线程操作 ,当有一个用户在对Hive进行操作时,其他用户则无法操作, 若应用在生产环境效率低下; -
- 当在
切换目录后,重新进入Hive会找不到原来已经创建的数据库和表 。主要原因是比如第一次是在bin目录下进入Hive,在进入后,会在bin目录下创建一个metaStore.db的目录和一个derby.log的日志文件. 那么经过更换目录后,然后进入Hive就会存在一个问题,原有的元数据信息都是基于bin目录下创建的,所以在找数据库和表的信息时候,都是基于bin目录的,而此时就会存在找不到原有创建的数据库和表的信息,所以会将默认的Derby数据库进行更换为Mysql。
2.4 安装MySQL
-
检查当前系统是否安装了Mysql, 如果有, 卸载之; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p6AVgCfd-1627818272721)(2021-07-31-17-05-13.png)] -
下载后, 将安装包 Mysql完全版+JDBC连接器, 提取码: lqi4拷贝到linux系统的/opt/software目录下, 解压之, 连接器后面再用. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3nAkvy9g-1627818272722)(2021-07-31-17-46-53.png)] -
按照以下顺序(common->libs–>libs-compat–>client–>server),执行安装命令 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j7Sd8Dgu-1627818272723)(2021-07-31-17-53-18.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e5Ot7WKR-1627818272724)(2021-07-31-17-53-57.png)] -
删除/etc/my.cnf 文件中datadir所指向的目录中所有的内容;(当然初次安装, 里面是没有数据的,也就不需要执行这一步了.)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0uTqWAMa-1627818272725)(2021-07-31-19-32-49.png)]
- 初始化数据库, 并查看临时生成的root用户的密码
-
初始化 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ajDs7cg-1627818272726)(2021-07-31-19-39-33.png)] -
查看临时生成root用户的密码 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wEoXSR7a-1627818272727)(2021-07-31-19-42-37.png)]
- 启动Mysql服务
sudo systemctl start mysqld
# 验证mysql是否为running
sudo systemctl status mysqld
可能会出现的问题: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2qjPeDIZ-1627818272729)(2021-07-31-20-05-40.png)]
解决办法: /etc/selinux/config里修改SELINUX=permissive后,再reboot就可了!
- 登录mysql数据库, 并修改root用户的密码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FM60GByv-1627818272730)(2021-07-31-20-39-31.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Wjbl881-1627818272732)(2021-07-31-20-39-05.png)]
可能出现的问题: Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)
解决方法:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GR1VBkwN-1627818272733)(2021-07-31-20-40-31.png)]
- 修改mysql库下的user表中的root用户, 让其允许任意ip连接(而不止 root@localhost)
mysql> update mysql.user set host='%' where user='root';
mysql> flush privileges;
2.5 Hive 元数据配置到MySQL
2.5.1 将MySQl的JDBC驱动拷贝到Hive的lib目录下
- /opt/software/mysql-connector-xx -> $HIVE_HOME/lib
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tI6pctEa-1627818272733)(2021-08-01-07-56-08.png)]
2.5.2 配置MetaStore到MySQL
- 在 $HIVE_HOME/conf 新建
hive-site.xml , 并输入以下内容:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://bigdata01:3306/metastore?useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<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>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
- 登录mysql, 并创建一个数据库作为元数据库;
[win10@bigdata01 hive-3.1.2] mysql -u root -p123456;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yWWeMmyV-1627818272734)(2021-08-01-08-21-24.png)]
- 初始化Hive的元数据库
[win10@bigdata hive-3.1.2]schematool -initSchema -dbType mysql --verbose
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Y3BXk3o-1627818272735)(2021-08-01-08-24-34.png)]
2.5.3 再次启动Hive
- 启动后Hive(一定不要忘了开启Hadoop集群, 不然又得是connection refused报错!!)
[win10@bigdata01 hive-3.1.2]bin/hive
- 在xshell(crt)新建会话窗口, 并切换到hive目录再次启动一个hive 会话, 可以看到在切换元数据库为mysql后, 可以支持多用户访问元数据库了;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YrqCsSe3-1627818272736)(2021-08-01-08-29-18.png)]
2.6 访问Hive的三种方式
2.6.1 前面提到的访问, 即本地访问 bin/hive
2.6.2 使用元数据服务的方式访问Hive
- 在 hive-site.xml 文件中添加如下配置信息:
<property>
<name>hive.metastore.uris</name>
<value>thrift://bigdata01:9083</value>
</property>
- 启动 metastore后, 去启动 hive
要注意到, metastore service是前台进程, 是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随之消失。所以这个服务启动后, 我们需要重新开一个终端进行别的操作 .
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4B9h2io4-1627818272737)(2021-08-01-11-11-26.png)]
[win10@bigdata01 hive-3.1.2] hive --service metastore
[win10@bigdata01 hive-3.1.2] bin/hive
注意: 在这里容易发生下面的错误 org.apache.thrift.transport.TTransportException: Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083.
错误原因: 启动hive服务(hive --service metastore 之前 开启了hive(bin/hive)) 解决办法: jps, 然后用 kill -9 pid 删除所有的 runjar [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A3I8qpEE-1627818273326)(2021-08-01-10-06-55.png)]
2.6.3 使用JDBC方式访问Hive
- 在 hive-site.xml 添加以下配置信息
<property>
<name>hive.server2.thrift.bind.host</name>
<value>bigdata01</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
- 启动 hiveserver2(同样也是前台进程)(在这之前, 前面我们配置的元数据服务也是需要启动的 哦!)
前提: 开启元数据服务(前台进程) hive --service metastore
[win10@bigdata01 hive] hive --service hiveserver2
- 启动成功的标志
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aIoKLi0O-1627818272738)(2021-08-01-13-53-26.png)]
在这一步需要注意的是: hiveserver2的启动时间会比较长一些, 当你观察日志(tail -f /tmp/linux用户名/hive.log)的时候,还会出现报错(如下图所示), 这个错误的主要原因是我们没有设置tez引擎相关的东西 , 此时一分钟之后将会重试开启hiveserver2, 我们只需耐心等待启动成功即可. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zSR4D9JA-1627818273327)(2021-08-01-11-06-58.png)]
什么是hiveserver2, 它的作用是什么?
- 启动 beeline客户端
[win10@bigdata01 hive-3.1.2] bin/beeline -u jdbc:hive2://bigdata01:10000 -n win10
注意: 这里极易出现以下错误: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SnRJ26aB-1627818272739)(2021-08-01-11-46-13.png)] 解决办法: beeline连接hiveserver2报错:User: root is not allowed to impersonate root
- 以上工作做完之后, 成功连接会出现以下界面:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-whhsNc8z-1627818272740)(2021-08-01-11-48-05.png)]
- Hive 服务启停脚本(只使用,暂时不用理解)
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 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
- 赋予执行权限;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GqjX5kAE-1627818272742)(2021-08-01-15-00-24.png)]
- 添加到全局环境变量, 随处便可运行;
- 其实有点脱裤子放屁, 因为这个脚本正好是放在了hive安装目录下的/bin目录中, 权当复习了哈哈
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HySpornK-1627818272743)(2021-08-01-15-32-21.png)]
-
在我们脚本启动时候, 便可以利用 bin/hive , 或者 bin/beeline -u jdbc:hive2://bigdata01:10000 -n win10 启动hive客户端了 -
注释掉 hiveServer2服务的启动配置, 因为我们访问hive有三种方式呢, 这种使用(metastore service + hiveserver2), 然后在用beeline启动客户端的交互方式太麻烦,时间还长, 所以我们在下面的实操中不使用这种方式, 而是直接使用 bin/hive 启动hive客户端进行交互操作.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2TpJaGpo-1627818272744)(2021-08-01-15-47-26.png)]
2.7 Hive常用的交互命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZWGjQgn-1627818272746)(2021-08-01-16-58-21.png)]
- hive -e “sql语句;”
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0F15lmV0-1627818272747)(2021-08-01-16-57-32.png)] - hive -f 写入了sql命令的文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-enyLKLld-1627818272748)(2021-08-01-16-56-52.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9s9hN5XE-1627818272750)(2021-08-01-16-56-10.png)]
- 追加.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5035EBmD-1627818272751)(2021-08-01-16-58-53.png)]
可能出现的问题:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ut56dEQ-1627818272752)(2021-08-01-16-52-34.png)]
2.8 Hive其他命令操作
-
退出hive窗口(exit/quit ) -
在hive 客户端里面查看hdfs文件系统(dfs -ls / ) [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MpkAuRGl-1627818272753)(2021-08-01-17-01-56.png)] -
查看在hive中输入的历史命令
- 进入到当前用户的主目录(/root 或者是 /home/win10)
cat .hivehistory - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oecJNthC-1627818272754)(2021-08-01-17-05-10.png)]
2.9 Hive 常见属性配置
2.9.1 Hive运行日志信息配置
- Hive 的运行日志默认放在: /tmp/用户名/hive.log中, 非当天的日志自动命名为 hive.log.年-月-日
- 下面我们修改运行日志的存储目录为
/opt/module/hive-3.1.2/logs
- 修改**/opt/module/hive-3.1.2/conf/hive-log4j2.properties.template**文件名,改为
hive-log4j.properties [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GTePASK4-1627818272756)(2021-08-01-17-15-52.png)] - 修改上述文件中log的存放位置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-84kdh7CF-1627818272757)(2021-08-01-17-26-41.png)]
2.9.2 打印当前数据库名和表名(方便)
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rDK0KruX-1627818272758)(2021-08-01-17-37-52.png)]
2.9.3 参数配置方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Di3RoODp-1627818272759)(2021-08-01-19-23-26.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cJu47cqO-1627818272760)(2021-08-01-19-25-00.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ImoF6GYk-1627818272761)(2021-08-01-19-26-52.png)] 转存中…(img-84kdh7CF-1627818272757)]
|