一、安装部署Hive
1.2 安装Hive
把 apache-hive-3.1.2-bin.tar.gz 上传到 linux 的 /opt/software 目录下
将 /opt/software/ 目录下的 apache-hive-3.1.2-bin.tar.gz 到 /opt/module/ 目录下面
tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/module/
修改解压后的目录名称为hive
mv apache-hive-3.1.2-bin/ /opt/module/hive
1.2 添加环境变量
修改/etc/profile.d/my_env.sh文件,将hive的/bin目录添加到环境变量
[atguigu@hadoop102 hive]$ sudo vim /etc/profile.d/my_env.sh
……
\#HIVE_HOME
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/bin
[atguigu@hadoop102 hive]$ source /etc/profile
1.3 初始化Derby元数据库
在hive根目录下,使用/bin目录中的schematool命令初始化hive自带的Derby元数据库
schematool -dbType derby -initSchema
1.4 如何解决jar包冲突
执行上述初始化元数据库时,会发现存在jar包冲突问题,现象如下:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/module/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/module/hadoop-3.1.3/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Metastore connection URL: jdbc:derby:;databaseName=metastore_db;create=true
Metastore Connection Driver : org.apache.derby.jdbc.EmbeddedDriver
Metastore connection User: APP
Starting metastore schema initialization to 3.1.0
Initialization script hive-schema-3.1.0.derby.sql
解决jar冲突问题,只需要将hive的 /lib 目录下的 log4j-slf4j-impl-2.10.0.jar 重命名即可
mv lib/log4j-slf4j-impl-2.10.0.jar lib/log4j-slf4j-impl-2.10.0.bak
二、启动Hive
2.1 执行/bin目录下的hive命令
执行/bin目录下的hive命令,就可以启动hive,并通过cli方式连接到hive
bin/hive
2.2 Hive简单使用
hive> show databases; // 查看当前所有的数据库
OK
default
Time taken: 0.472 seconds, Fetched: 1 row(s)
hive> show tables; // 查看当前所有的表
OK
Time taken: 0.044 seconds
hive> create table test1(id int); // 创建表test1,表中只有一个字段,字段类型是int
OK
Time taken: 0.474 seconds
hive> insert into test1 values(1001); // 向test1表中插入数据
Query ID = atguigu_20211018153727_586935da-100d-4d7e-8a94-063d373cc5dd
Total jobs = 3
……
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
……
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 6.19 sec HDFS Read: 12769 HDFS Write: 208 SUCCESS
Total MapReduce CPU Time Spent: 6 seconds 190 msec
OK
Time taken: 31.901 second
hive> select * from test1; // 查看test1表中所有数据
OK
1001
Time taken: 0.085 seconds, Fetched: 1 row(s)
Hive 默认使用的元数据库为 derby 并且部署方式是内嵌式,在开启Hive之后就会独占元数据库,且不与其他客户端共享数据,如果想多窗口操作就会报错,操作比较局限。因此我们可以直接采用MySQL作为元数据库或者使用元数据服务的方式部署 MetaStore元数据库,就可以支持多窗口操作。
三、元数据的三种访问方式
3.1 元数据库内嵌模式
在此模式中会连接到一个in-memory的数据库Derby中,一般用于单元测试。
在内嵌模式下,命令行执行 jps –ml 命令,只能看到一个CliDriver进程。
jps –ml
7170 sun.tools.jps.Jps -ml
2467 org.apache.hadoop.hdfs.server.namenode.NameNode
2676 org.apache.hadoop.hdfs.server.datanode.DataNode
3364 org.apache.hadoop.yarn.server.nodemanager.NodeManager
3656 org.apache.hadoop.mapreduce.v2.hs.JobHistoryServer
6127 org.apache.hadoop.util.RunJar /opt/module/hive/lib/hive-cli-3.1.2.jar org.apache.hadoop.hive.cli.CliDriver
3.2 元数据库直连模式(本地模式)
通过网络连接到一个关系型数据库中,上面我们配置元数据库位MySQL时,就是这种模式
本地模式采用外部数据库来存储元数据,目前支持的数据库有:MySQL、Postgres、Oracle、MS SQL Server.在这里我们使用 MySQL。
本地模式不需要单独起 MetaStore 服务,用的是跟 hive 在同一个进程里的 MetaStore 服务。也就是说当你启动一个hive 服务,里面默认会帮我们启动一个 MetaStore 服务。 hive 会根据conf/目录下hive-site.xml的 hive.metastore.uris 参数值来判断,如果为空,则为本地模式。
本地模式下hive的配置主需要指定mysql的相关信息即可。
3.2.1 配置mysql
3.2.1.1 MySQL安装部署
1、安装检查
检查当前系统是否安装过Mysql,如果存在就是用下列命令移除,如果不存在则忽略。
rpm -qa|grep mariadb
如果有安装过,会显示有信息,使用下列命令移除安装。如果没有直接下一步就好
sudo rpm -e --nodeps mariadb-libs
2、执行rpm安装
执行rpm安装,需要将以下安装包导入到要安装的服务器中,并放在某一个文件夹下,
mysql-community-client-5.7.28-1.el7.x86_64.rpm
mysql-community-common-5.7.28-1.el7.x86_64.rpm
mysql-community-devel-5.7.28-1.el7.x86_64.rpm
mysql-community-embedded-5.7.28-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.28-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.28-1.el7.x86_64.rpm
mysql-community-libs-5.7.28-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
mysql-community-server-5.7.28-1.el7.x86_64.rpm
mysql-community-test-5.7.28-1.el7.x86_64.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
3、删除mysql的数据存储目录下的所有数据
删除mysql的数据存储目录下的所有数据,目录地址在 /etc/my.cnf 文件中 datadir 指向的目录下的所有内容
查看datadir的值:
vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql //删除这个文件夹下的内容
删除/var/lib/mysql目录下的所有内容:
cd /var/lib/mysql
sudo rm -rf ./* //千万注意执行命令的位置,否则库就没了
4、初始化数据库
这个是mysql数据库安装后的初始化
sudo mysqld --initialize --user=mysql
5、查看临时密码并复制
初始化完成后,查看临时生成的root用户的密码,也是首次登录msql的密码
sudo cat /var/log/mysqld.log
2021-10-18T08:50:32.172049Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2021-10-18T08:50:32.364322Z 0 [Warning] InnoDB: New log files created, LSN=45790
2021-10-18T08:50:32.397350Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2021-10-18T08:50:32.453522Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 73e2af3c-2ff0-11ec-af41-000c29830057.
2021-10-18T08:50:32.454765Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2021-10-18T08:50:32.978960Z 0 [Warning] CA certificate ca.pem is self signed.
2021-10-18T08:50:33.314317Z 1 [Note] A temporary password is generated for root@localhost: OU+*c.C9FZy;
其中**OU+*c.C9FZy;**是你的初始密码,将其复制下来。
6、启动MySQL服务
sudo systemctl start mysqld
7、登录MySQL数据库
mysql -uroot -p
Enter password: (你的暂时密码) //输入临时生成的密码,刚才复制的密码
8、修改root用户的密码
mysql> set password = password("新密码"); //输入新密码,记得加分号
9、修改mysql库下的user表中的root用户允许任意ip连接
mysql> update mysql.user set host='%' w here user='root';
10、刷新,使得修改生效
mysql> flush privileges;
3.2.1.2 拷贝驱动
将MySQL的JDBC驱动拷贝到Hive的lib目录下
cp mysql-connector-java-5.1.37.jar /opt/module/hive/lib
3.2.1.3 配置Metastore到MySql
在$HIVE_HOME/conf 目录下新建 hive-site.xml 文件
vim 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://hadoop102: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>你的密码</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</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>
</configuration>
3.2.1.4 Hive初始化元数据库
1)登陆MySQL
mysql -uroot -p 你的密码
2)新建Hive元数据库
mysql> create database metastore;
mysql> quit;
3)初始化Hive元数据库
bin/schematool -initSchema -dbType mysql -verbose
4)先启动hadoop集群,在启动Hive,查看是否安装成功。
3.3 使用 MetaStore 服务访问元数据库模式
在服务器端启动MetaStore服务,客户端利用Thrift协议通过MetaStore服务访问元数据库。元数据服务的访问方式更适合在生产环境中部署使用,相比内嵌式,该方式更加的灵活。
将Mysql做为元数据库,部署元数据服务
在 $HIVE_HOME/conf中 的 hive-site.xml 文件中添加如下配置信息
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop102:9083</value>
</property>
注意:在配置了此参数后,启动hive之前必须先启动元数据服务,否则,hive启动后无法连接到元数据服务
启动元数据服务:
hive --service metastore
//启动成功显示如下信息
2021-10-18 18:22:24: Starting Hive Metastore Server
注意: 启动服务后,该窗口会被阻塞,不能再操作,需打开一个新的shell窗口做别的操作。
四、hive的两种访问方式
4.1 cil命令行方式
在前面的操作中,我们都是通过cli的方式访问hive的。
我们可以切身的体会到,通过cli的方式访问hive的不足,如:cli太过笨重,需要hive的jar支持。
4.2 JDBC方式
JDBC方式,本质上是将hive包装为服务发布出去,开发者使用JDBC的方式连接到服务,从而操作hive。
1、在 hive-site.xml 文件中添加如下配置信息
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop102</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
2、启动hive服务
这里需要考虑元数据的访问方式,如何使用元数据服务的模式,需要提前开启元数据服务
开启元数据服务:
hive --service metastore
开启hive服务
hive --service hiveserver2
3、启动beeline客户端,需要等到hiveserver2完全启动。(它会先去尝试启动tez、spark等引擎,都没有时最后才会使用MR)
beeline -u jdbc:hive2://hadoop102:10000 -n atguigu
4、看到如下界面后,证明连接成功,可以进行查询了。
Connecting to jdbc:hive2://hadoop102:10000
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 3.1.2 by Apache Hive
0: jdbc:hive2://hadoop102:10000>
eeline客户端,需要等到hiveserver2完全启动。(它会先去尝试启动tez、spark等引擎,都没有时最后才会使用MR)
beeline -u jdbc:hive2://hadoop102:10000 -n atguigu
4、看到如下界面后,证明连接成功,可以进行查询了。
Connecting to jdbc:hive2://hadoop102:10000
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 3.1.2 by Apache Hive
0: jdbc:hive2://hadoop102:10000>
|