大数据集群学习(6):Hive数据仓库的搭建与使用

70 阅读6分钟

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)、基本框架图

image.png

使用过程中,一般会开启两个服务,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…

image.png

下载好之后,上传至/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&amp;useSSL=false&amp;useUnicode=true&amp;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
# 输入密码 

image.png
可以看到新建了个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;

image.png
可以看到成功创建了74张表,这个时候就可以exit/quit退出mysql了
到这里就完成了hive的配置了

启动Hive

启动Hive之前,先启动Hadoop集群(配置了Hadoop配置文件后需要重启Hadoop)

# 关闭Hadoop
stop-all.sh
# 开启Hadoop
start-all.sh

可以简单启动hive,来验证一下是否配置安装成功

bin/hive

image.png
显示这样就是安装成功
退出hive

hive> quit;

启动Hive的MetaStore服务和hiveserver2服务
首先验证一下是否可以成功启动,因为这两个服务启动后是显示在前台的,验证成功后再启动至后台
启动metastore

bin/hive --service metastore

image.png
启动后会一直在前台,无法进行其他操作,按Ctrl+C暂时退出

启动hiveserver2

bin/hive --service hiveserver2

image.png 启动后同样会一直在前台,无法进行其他操作,按Ctrl+C暂时退出

成功启动后,将这两个服务启动至后台
启动metastore

nohup bin/hive --service metastore &

image.png
出现了这个界面后,先等待10-15s,再按回车,主要是为了等服务启动成功,太快操作会导致服务启动失败
按jps查看进程

image.png
出现了一个RunJar进程,看进程号就知道这个是metastore服务,这样就启动到了后台

启动hiveserver2

nohup bin/hive --service hiveserver2 &

同样等待10-15s
按jps就可以看到两个服务了
image.png

远程连接Hive

1、Beeline连接
输入beeline,进入beeline客户端

image.png 输入以下命令连接hive

!connect jdbc:hive2://node1:10000

然后输入用户名,密码
image.png
这样就是连接成功了
测试 image.png
这里一开始是只有default这个库,test1是我测试创建的的。

2、IDEA连接 在IDEA右边侧边,点击Database

image.png

image.png

image.png 连上之后就可以在IDEA里面编写Sql了

新建文件 image.png(记得带上后缀.sql)
测试,随便写一个sql,第一次执行的时候,要选个Session。 image.png
运行结果
image.png

3、使用
在HDFS目录上创建一个hivedata目录

hadoop fs -mkdir /hivedata

在浏览器进入hadoop网页,进入hdfs目录能看到刚刚创建的目录

image.png
在本地创建个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才会有数据显示

image.png

如果你跟着做到了这一步,恭喜你,可以正常使用Hive了
以上过程中若有不对的地方,欢迎指出来哈😀