【Hive】Hive安装

Hive

第一章 Hive的基础知识
第二章 Hive安装

第三章 DDL(Data Definition Language)数据定义

第四章 DML(Data Manipulation Language)数据操作

第五章 Hive查询

第六章 Hive的基础知识

第七章 Hive函数

第八章 分区表和分桶表

第九章 文件格式和压缩

第十章 企业级调优

附录:常见错误及解决方案

Hive安装

Hive安装地址

1)Hive官网地址

Hive官网地址

2)文档查看地址

文档查看地址

3)下载地址

下载地址

4)github地址

github地址

Hive安装部署

安装Hive

1)把apache-hive-3.1.3-bin.tar.gz上传到Linux的/opt/software目录下

2)解压apache-hive-3.1.3-bin.tar.gz到/opt/module/目录下面

复制代码
tar -zxvf /opt/software/apache-hive-3.1.3-bin.tar.gz -C /opt/module

3)修改apache-hive-3.1.3-bin.tar.gz的名称为hive

复制代码
mv /opt/module/apache-hive-3.1.3-bin/ /opt/module/hive

4)修改/etc/profile.d/my_env.sh,添加环境变量

复制代码
sudo vim /etc/profile.d/my_env.sh

(1)添加内容

复制代码
#HIVE_HOME
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/bin

(2)source一下

复制代码
source /etc/profile.d/my_env.sh

5)初始化元数据库(默认是derby数据库)

复制代码
bin/schematool -dbType derby -initSchema

启动并使用Hive

1)启动Hive

在Hive目录下

复制代码
bin/hive

2)使用Hive

复制代码
hive> show databases;
hive> show tables;
hive> create table stu(id int, name string);
hive> insert into stu values(1,"ss");
hive> select * from stu;

观察HDFS的路径/user/hive/warehouse/stu,体会Hive与Hadoop之间的关系

Hive中的表在Hadoop中是目录;Hive中的数据在Hadoop中是文件。

3)在Xshell窗口中开启另一个窗口开启Hive,在/tmp/atguigu目录下监控hive.log文件

复制代码
 tail -f hive.log

Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database /opt/module/hive/metastore_db.
        at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
        at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
        at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.privGetJBMSLockOnDB(Unknown Source)
        at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.run(Unknown Source)
...

原因在于Hive默认使用的元数据库为derby。derby数据库的特点是同一时间只允许一个客户端访问。如果多个Hive客户端同时访问,就会报错。由于在企业开发中,都是多人协作开发,需要多客户端同时访问Hive,怎么解决呢?我们可以将Hive的元数据改为用MySQL存储,MySQL支持多客户端同时访问。

4)首先退出hive客户端。然后在Hive的安装目录下将derby.log和metastore_db删除,顺便将HDFS上目录删除

复制代码
--退出hive客户端
hive> quit;
--将derby.log和metastore_db删除
 rm -rf derby.log metastore_db
 hadoop fs -rm -r /user

5)删除HDFS中/user/hive/warehouse/stu中数据

MySQL安装

基于docker安装MySQL8.x

Linux安装MySQL5.x

配置Hive元数据存储到MySQL

配置元数据到MySQL

1)新建Hive元数据库

复制代码
create database metastore;

2)将MySQL的JDBC驱动拷贝到Hive的lib目录下。

复制代码
cp mysql-connector-java-5.1.37.jar $HIVE_HOME/lib

3)在$HIVE_HOME/conf目录下新建hive-site.xml文件

复制代码
vim $HIVE_HOME/conf/hive-site.xml

添加如下内容:

复制代码
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!-- jdbc连接的URL -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://MySQL地址:3306/metastore?useSSL=false</value>
    </property>
    
    <!-- jdbc连接的Driver-->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    
	<!-- jdbc连接的username-->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>MySQL账号</value>
    </property>

    <!-- jdbc连接的password -->
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>MySQL密码</value>
    </property>

    <!-- Hive默认在HDFS的工作目录 -->
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
    </property>
</configuration>

5)初始化Hive元数据库(修改为采用MySQL存储元数据)

复制代码
bin/schematool -dbType mysql -initSchema -verbose

验证元数据是否配置成功

1)再次启动Hive

复制代码
bin/hive

2)使用Hive

复制代码
hive> show databases;
hive> show tables;
hive> create table stu(id int, name string);
hive> insert into stu values(1,"ss");
hive> select * from stu;

3)在Xshell窗口中开启另一个窗口开启Hive(两个窗口都可以操作Hive,没有出现异常)

复制代码
hive> show databases;
hive> show tables;
hive> select * from stu;

查看MySQL中的元数据

查看元数据库metastore

复制代码
mysql> show databases;
mysql> use metastore;
mysql> show tables;

(1)查看元数据库中存储的库信息

复制代码
mysql> select * from DBS;
+-------+-----------------------+-------------------------------------------+---------+------------+------------+-----------+
| DB_ID | DESC                  | DB_LOCATION_URI                           | NAME    | OWNER_NAME | OWNER_TYPE | CTLG_NAME |
+-------+-----------------------+-------------------------------------------+---------+------------+------------+-----------+
|     1 | Default Hive database | hdfs://hadoop102:8020/user/hive/warehouse | default | public     | ROLE       | hive      |
+-------+-----------------------+-------------------------------------------+---------+------------+------------+-----------+

(2)查看元数据库中存储的表信息

复制代码
mysql> select * from TBLS;
+--------+-------------+-------+------------------+---------+------------+-----------+-------+----------+---------------+
| TBL_ID | CREATE_TIME | DB_ID | LAST_ACCESS_TIME | OWNER   | OWNER_TYPE | RETENTION | SD_ID | TBL_NAME | TBL_TYPE      | 
+--------+-------------+-------+------------------+---------+------------+-----------+-------+----------+---------------+
|      1 |  1656318303 |     1 |                0 | atguigu | USER       |         0 |     1 | stu      | MANAGED_TABLE |
+--------+-------------+-------+------------------+---------+------------+-----------+-------+----------+---------------+

(3)查看元数据库中存储的表中列相关信息

复制代码
mysql> select * from COLUMNS_V2;
+-------+----------+---------+------------+-------------+-------------+--------+
| CS_ID | CAT_NAME | DB_NAME | TABLE_NAME | COLUMN_NAME | COLUMN_TYPE | TBL_ID |
+-------+----------+---------+------------+-------------+-------------+--------+
|     1 | hive     | default | stu        | id          | int         |      1 |
|     2 | hive     | default | stu        | name        | string      |      1 |
+-------+----------+---------+------------+-------------+-------------+--------+

Hive服务部署

hiveserver2服务

Hive的hiveserver2服务的作用是提供jdbc/odbc接口,为用户提供远程访问Hive数据的功能,例如用户期望在个人电脑中访问远程服务中的Hive数据,就需要用到Hiveserver2。

用户说明

在远程访问Hive数据时,客户端并未直接访问Hadoop集群,而是由Hivesever2代理访问。由于Hadoop集群中的数据具备访问权限控制,所以此时需考虑一个问题:那就是访问Hadoop集群的用户身份是谁?是Hiveserver2的启动用户?还是客户端的登录用户?

答案是都有可能,具体是谁,由Hiveserver2的hive.server2.enable.doAs参数决定,该参数的含义是是否启用Hiveserver2用户模拟的功能。若启用,则Hiveserver2会模拟成客户端的登录用户去访问Hadoop集群的数据,不启用,则Hivesever2会直接使用启动用户访问Hadoop集群数据。模拟用户的功能,默认是开启的。

具体逻辑如下:

未开启用户模拟功能:

开启用户模拟功能:

生产环境,推荐开启用户模拟功能,因为开启后才能保证各用户之间的权限隔离。

hiveserver2部署

Hadoop端配置

hivesever2的模拟用户功能,依赖于Hadoop提供的proxy user(代理用户功能),只有Hadoop中的代理用户才能模拟其他用户的身份访问Hadoop集群。因此,需要将hiveserver2的启动用户设置为Hadoop的代理用户,配置方式如下:

修改配置文件core-site.xml,然后记得分发三台机器

复制代码
cd $HADOOP_HOME/etc/hadoop
vim core-site.xml

增加如下配置:

复制代码
<!--配置所有节点的Hadoop的代理用户都可作为代理用户-->
<property>
    <name>hadoop.proxyuser.Hadoop的代理用户.hosts</name>
    <value>*</value>
</property>

<!--配置Hadoop的代理用户能够代理的用户组为任意组-->
<property>
    <name>hadoop.proxyuser.Hadoop的代理用户.groups</name>
    <value>*</value>
</property>

<!--配置atguigu用户能够代理的用户为任意用户-->
<property>
    <name>hadoop.proxyuser.Hadoop的代理用户.users</name>
    <value>*</value>
</property>

Hive端配置

在hive-site.xml文件中添加如下配置信息

复制代码
<!-- 指定hiveserver2连接的host -->
<property>
	<name>hive.server2.thrift.bind.host</name>
	<value>hiveserver2连接的hos</value>
</property>

<!-- 指定hiveserver2连接的端口号 -->
<property>
	<name>hive.server2.thrift.port</name>
	<value>10000</value>
</property>

测试

(1)启动hiveserver2

复制代码
bin/hive --service hiveserver2

(2)使用命令行客户端beeline进行远程访问

启动beeline客户端

复制代码
bin/beeline -u jdbc:hive2://hadoop102:10000 -n atguigu

看到如下界面

复制代码
Connecting to jdbc:hive2://hadoop102:10000
Connected to: Apache Hive (version 3.1.3)
Driver: Hive JDBC (version 3.1.3)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 3.1.3 by Apache Hive
0: jdbc:hive2://hadoop102:10000>

(3)使用图形化客户端进行远程访问

4)配置DataGrip连接

(1)创建连接

(2)配置连接属性

所有属性配置,和Hive的beeline客户端配置一致即可。初次使用,配置过程会提示缺少JDBC驱动,按照提示下载即可。

(3)界面介绍

(4)测试sql执行

(5)修改数据库

metastore服务

Hive的metastore服务的作用是为Hive CLI或者Hiveserver2提供元数据访问接口。

metastore运行模式

metastore有两种运行模式,分别为嵌入式模式和独立服务模式。下面分别对两种模式进行说明:

(1)嵌入式模式

(2)独立服务模式

生产环境中,不推荐使用嵌入式模式。因为其存在以下两个问题:

(1)嵌入式模式下,每个Hive CLI都需要直接连接元数据库,当Hive CLI较多时,数据库压力会比较大。

(2)每个客户端都需要用户元数据库的读写权限,元数据库的安全得不到很好的保证。

metastore部署

(1)嵌入式模式

嵌入式模式下,只需保证Hiveserver2和每个Hive CLI的配置文件hive-site.xml中包含连接元数据库所需要的以下参数即可:

复制代码
    <!-- jdbc连接的URL -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://URL:3306/metastore?useSSL=false</value>
    </property>
    
    <!-- jdbc连接的Driver-->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    
	<!-- jdbc连接的username-->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>jdbc连接的username</value>
    </property>

    <!-- jdbc连接的password -->
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>jdbc连接的password</value>
    </property>

(2)独立服务模式

独立服务模式需做以下配置:

首先,保证metastore服务的配置文件hive-site.xml中包含连接元数据库所需的以下参数:

复制代码
    <!-- jdbc连接的URL -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://jdbc连接的URL:3306/metastore?useSSL=false</value>
    </property>
    
    <!-- jdbc连接的Driver-->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    
	<!-- jdbc连接的username-->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>jdbc连接的username</value>
    </property>

    <!-- jdbc连接的password -->
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>jdbc连接的password</value>
    </property>

其次,保证Hiveserver2和每个Hive CLI的配置文件hive-site.xml中包含访问metastore服务所需的以下参数:

复制代码
<!-- 指定metastore服务的地址 -->
<property>
	<name>hive.metastore.uris</name>
	<value>thrift://metastore服务的地址:9083</value>
</property>

注意:主机名需要改为metastore服务所在节点,端口号无需修改,metastore服务的默认端口就是9083。

测试

此时启动Hive CLI,执行shou databases语句,会出现一下错误提示信息:

复制代码
hive (default)> show databases;
FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

这是因为我们在Hive CLI的配置文件中配置了hive.metastore.uris参数,此时Hive CLI会去请求我们执行的metastore服务地址,所以必须启动metastore服务才能正常使用。

metastore服务的启动命令如下:

复制代码
--前端启动
hive --service metastore

注意:启动后该窗口不能再操作,需打开一个新的Xshell窗口来对Hive操作。

重新启动 Hive CLI,并执行shou databases语句,就能正常访问了

复制代码
bin/hive

Hive使用技巧

Hive参数配置方式

1)查看当前所有的配置信息

复制代码
hive>set;

2)参数的配置三种方式

(1)配置文件方式

默认配置文件:hive-default.xml

用户自定义配置文件:hive-site.xml

注意:用户自定义配置会覆盖默认配置。另外,Hive也会读入Hadoop的配置,因为Hive是作为Hadoop的客户端启动的,Hive的配置会覆盖Hadoop的配置。配置文件的设定对本机启动的所有Hive进程都有效。

(2)命令行参数方式

①启动Hive时,可以在命令行添加-hiveconf param=value来设定参数。例如:

复制代码
bin/hive -hiveconf mapreduce.job.reduces=10;

注意:仅对本次Hive启动有效。

②查看参数设置

复制代码
set mapreduce.job.reduces;set mapreduce.job.reduces;

(3)参数声明方式

可以在HQL中使用SET关键字设定参数,例如:

复制代码
hive(default)> set mapreduce.job.reduces=10;

注意:仅对本次Hive启动有效。

查看参数设置:

复制代码
set mapreduce.job.reduces;

上述三种设定方式的优先级依次递增。即配置文件 < 命令行参数 < 参数声明。注意某些系统级的参数,例如log4j相关的设定,必须用前两种方式设定,因为那些参数的读取在会话建立以前已经完成了。

Hive常见属性配置

Hive客户端显示当前库和表头

(1)在hive-site.xml中加入如下两个配置:

复制代码
<property>
    <name>hive.cli.print.header</name>
    <value>true</value>
    <description>Whether to print the names of the columns in query output.</description>
</property>
<property>
    <name>hive.cli.print.current.db</name>
    <value>true</value>
    <description>Whether to include the current database in the Hive prompt.</description>
</property>

(2)hive客户端在运行时可以显示当前使用的库和表头信息

复制代码
[yj@hadoop102 conf]$ hive

hive (default)> select * from stu;
OK
stu.id	stu.name 
1	ss
Time taken: 1.874 seconds, Fetched: 1 row(s)
hive (default)>

Hive运行日志路径配置

修改Hive的log存放日志到/opt/module/hive/logs

(1)修改$HIVE_HOME/conf/hive-log4j2.properties.template文件名称为

hive-log4j2.properties

复制代码
mv hive-log4j2.properties.template hive-log4j2.properties

(2)在hive-log4j2.properties文件中修改log存放位置

修改配置如下

复制代码
property.hive.log.dir=/opt/module/hive/logs

关闭Hadoop虚拟内存检查

在yarn-site.xml中关闭虚拟内存检查(虚拟内存校验,如果已经关闭了,就不需要配了)。

(1)修改前记得先停Hadoop

(2)在yarn-site.xml添加如下配置

复制代码
<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
</property>

(3)修改完后记得分发yarn-site.xml,并重启yarn。

相关推荐
哈哈很哈哈10 小时前
Hadoop JMX 配置的完整文档
大数据·hadoop·分布式
Dragon online10 小时前
数据仓库深度探索系列:架构选择与体系构建
大数据·数据仓库·分布式·架构·spark·大数据架构·数仓架构
数据要素X11 小时前
【数据架构08】数字化转型架构篇
大数据·数据库·数据仓库·架构·数据库架构
jzy371120 小时前
国产化适配鲲鹏arm环境:hive on tez 单节点部署实践总结
linux·hadoop·apache hive
wzy06232 天前
基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(三)
hadoop·impala
大数据狂人2 天前
深入剖析 StarRocks 与 Hive 的区别、使用场景及协同方案实践
大数据·starrocks·hive·数仓
wzy06232 天前
基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(二)
hive·hadoop·impala·sparksql
wzy06232 天前
基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(一)
hadoop·impala
wzy06232 天前
基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(六)
hadoop·hue
陆水A3 天前
数仓主题域划分
大数据·数据仓库·数据库开发·etl·etl工程师