Hive简介
1、概念
Hive最早是由Facebook开源用于解决海量结构化日志的数据统计,后贡献给开源社区,成为Apache顶级开源项目。
它是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能,其本质是将HQL转化成MapReduce程序。
2、优缺点
优:
(1)、Hive提供了提供完整的SQL查询功能。
(2)、避免直接编写Hadoop的MR程序,省去开发人员的学习成本。
(3)、常用于数据分析,执行的速度较慢(本质上是在执行MapReduce程序),适合处理大量数据。
缺:
(1)、不适用于处理实时数据与小量数据,会导致效率低下。
(2)、调优略微困难。
3、基本架构
(1)、Hive的数据是存储在Hadoop的HDFS上的,因此搭建Hive之前需要搭建好Hadoop。
(2)、Hive的元数据(Metastore)是存储在derby、mysql数据库中,推荐使用Mysql数据库存储,因此,搭建Hive之前也需要搭建Mysql,并设置mysql开机自启。
(3)、Hive提供了若干个用户接口:
CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)。
(4)、基本框架图
使用过程中,一般会开启两个服务,metastore、hiveserver2。
metastore服务是允许用户访问hive元数据。
hiveserver2是允许用户访问hive数据,也就是用于提交Sql查询的。
metastore和hiveserver2本质上都是Thrift Service。
连接Hive有两种方法,一个是CLI,一个是Beeline(JDBC,也就是远程连接)。
CLI是连接metastore服务,访问元数据,提交作业,是Sql直接本地编译。
Beeline是连接hiveserver2服务,访问hive数据,由hiveserver2编译,访问metastore,再提交作业。(一般JDBC等远程连接都是)。
Hive 下载与安装
去官网下载安装包
官网地址:archive.apache.org/dist/hive/h…
下载好之后,上传至/apps/hive目录下,解压缩,重命名(方便后续使用)。
tar -zxvf apache-hive-3.1.2-bin.tar.gz
mv apache-hive-3.1.2-bin hive-3.1.2
配置Hive
1、上传mysql驱动包
这里需要注意mysql版本是什么,如果是8.x的就上传8的jar包,是5.x的就上传5的驱动包,我这里用的是8.0.33的mysql,就上传了 mysql-connector-j-8.0.33.jar 这个jar包
cd /apps/hive/hive-3.1.2
查看mysql版本
mysqladmin --version
2、解决Hive与Hadoop之间guava版本差异
先将lib目录下的guava包删除,然后去Hadoop的share目录下将guava包复制过来
#删除lib目录下的guava包
cd /apps/hive/hive-3.1.2
rm -rf lib/guava-19.0.jar
#复制Hadoop的guava包
cd /apps/hadoop/hadoop-3.3.1/share/hadoop/common/lib
cp /apps/hadoop/hadoop-3.3.1/share/hadoop/common/lib/guava-27.0-jre.jar /apps/hive/hive-3.1.2/lib
3、修改Hadoop配置文件
在core-site.xml文件里添加如下配置内容,3台机子的hadoop配置文件里都需要加
cd /apps/hadoop/hadoop-3.3.1/etc/hadoop
vim core-site.xml
<!--允许root用户以任何主机和任何用户组的身份进行代理操作-->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
4、配置Hive
新建一个hive-site.xml文件
输入以下内容
<configuration>
<!-- 存储元数据mysql相关配置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value> jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</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.event.db.notification.api.auth</name>
<value>false</value>
</property>
<!-- 关闭元数据存储版本的验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
</configuration>
以下配置可以在Hadoop的core-site.xml配置文件中配置,也可以在Hive的hive-site.xml配置文件中配置,个人建议在hive-site.xml中配置,hive安装在哪个机子上,就配置哪个机子的Hadoop文件
<!--hiveserver2运行绑定host-->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node1</value>
</property>
<!--远程模式部署metastore metastore地址-->
<property>
<name>hive.metastore.uris</name>
<value>thrift://node1:9083</value>
</property>
修改hive-env.sh配置文件
# 配置HADOOP_HOME目录
export HADOOP_HOME=/apps/hadoop/hadoop-3.3.1
# 配置hive配置文件路径
export HIVE_CONF_DIR=/apps/hive/hive-3.1.2/conf
# 配置hive /lib目录路径
export HIVE_AUX_JARS_PATH=/apps/hive/hive-3.1.2/lib
5、初始化Hive,在Mysql中加入hive的信息
cd /apps/hive/hive-3.3.1
bin/schematool -initSchema -dbType mysql -verbos
初始化成功后会在mysql中创建74张表
可以进入mysql查看
mysql -u root -p
# 输入密码
可以看到新建了个hive的库
使用命令:
mysql> use hive;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
可以看到成功创建了74张表,这个时候就可以exit/quit退出mysql了
到这里就完成了hive的配置了
启动Hive
启动Hive之前,先启动Hadoop集群(配置了Hadoop配置文件后需要重启Hadoop)
# 关闭Hadoop
stop-all.sh
# 开启Hadoop
start-all.sh
可以简单启动hive,来验证一下是否配置安装成功
bin/hive
显示这样就是安装成功
退出hive
hive> quit;
启动Hive的MetaStore服务和hiveserver2服务
首先验证一下是否可以成功启动,因为这两个服务启动后是显示在前台的,验证成功后再启动至后台
启动metastore
bin/hive --service metastore
启动后会一直在前台,无法进行其他操作,按Ctrl+C暂时退出
启动hiveserver2
bin/hive --service hiveserver2
启动后同样会一直在前台,无法进行其他操作,按Ctrl+C暂时退出
成功启动后,将这两个服务启动至后台
启动metastore
nohup bin/hive --service metastore &
出现了这个界面后,先等待10-15s,再按回车,主要是为了等服务启动成功,太快操作会导致服务启动失败
按jps查看进程
出现了一个RunJar进程,看进程号就知道这个是metastore服务,这样就启动到了后台
启动hiveserver2
nohup bin/hive --service hiveserver2 &
同样等待10-15s
按jps就可以看到两个服务了
远程连接Hive
1、Beeline连接
输入beeline,进入beeline客户端
输入以下命令连接hive
!connect jdbc:hive2://node1:10000
然后输入用户名,密码
这样就是连接成功了
测试
这里一开始是只有default这个库,test1是我测试创建的的。
2、IDEA连接 在IDEA右边侧边,点击Database
连上之后就可以在IDEA里面编写Sql了
新建文件
(记得带上后缀.sql)
测试,随便写一个sql,第一次执行的时候,要选个Session。
运行结果
3、使用
在HDFS目录上创建一个hivedata目录
hadoop fs -mkdir /hivedata
在浏览器进入hadoop网页,进入hdfs目录能看到刚刚创建的目录
在本地创建个test.txt文件,输入测试数据
1,zhangsan,male
2,lisi,male
3,wangwu,female
4,laoliu,female
将test.txt上传到hdfs
hdfs dfs -put file1.txt /hivedata/
完成这一步后也能在hdfs网页上看到
在IDEA上编写sql
依次执行以下sql,新建表
create database test1;
use test1;
create table demo1(
sid int,
name string,
sex string
)row format delimited fields terminated by ',';
这里创建表的sql,与普通sql不同的是有一句:row format delimited fields terminated by ',';
这句话的意思是表格根据 "," 来分隔数据
将刚刚上传到hdfs的txt里面的数据导入到表里
load data inpath '/hivedata/test.txt' into table demo1;
进行了这一步之后,select才会有数据显示
如果你跟着做到了这一步,恭喜你,可以正常使用Hive了
以上过程中若有不对的地方,欢迎指出来哈😀