目录
- 前言
- 一、Hive入门
- 1.1. Hive本质
- 1.2. Hive架构原理
- 二、Hive3.1.3安装
- 1. 最小化安装部署(仅适合学习测试)
- 2. 安装MySQL
- 3. 卸载MySQL
- 4. 配置Hive元数据存储到MySQL中
- 5. Hive服务部署
- 5.1. hiveserver2服务(远程访问服务)
- 5.2. metastore服务
- 6.Hive使用技巧
- 6.1. Hive常用交互命令
- 6.2. Hive常用非交互命令(无需启动hive)
- 6.3. hive参数配置方式
- 6.4. Hive常见属性配置
- 总结
hive尚硅谷面试刷题网站
hive日志位置(root用户下):/tmp/root/hive.log
Hive入门官方文档点此前往
Hive是由Facebook开源,基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。
统计单词出现个数
- 在 Hadoop 课程中我们用 MapReduce程序实现的,当时需要写Mapper、Reducer和 Driver三个类,并实现对应逻辑,相对繁琐。
- 如果通过Hive SQL 实现,一行就搞定了,简单方便,容易理解
select count(*) from test group by id
是一个 Hadoop客户端,用于将HQL (Hive SQL)转化成MapReduce程序
Hive内部执行流程:解析器(解析SQL语句)、编译器(把SQL语句编译成MapReduce程序)、优化器(优化MapReduce程序)、执行器(将MapReduce程序运行的结果提交到HDFS)
元数据(Metastore):元数据包括数据库(默认是default)、表名、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。默认存储在自带的 derby 数据库中,由于 derby数据库只支持单客户端访问,生产环中为了多人开发,推荐使手MySQL存储 Metastore
驱动器(Driver):
语义分析(Semantic Analyzer):将AST进一步划分为 QeuryBlock
逻辑优化器(Logical Optimizer):对逻辑计划进行优化
在Hive架构中,逻辑优化器是负责对HiveQL查询进行逻辑优化的重要组件。逻辑优化器主要针对查询的逻辑结构进行优化,以提高查询性能和效率。下面是逻辑优化器的一些常见优化技术:
- 列剪裁(Column Pruning):逻辑优化器通过分析查询语句中涉及的列,剪裁掉不必要的列,从而减少数据传输和处理的开销。
- 谓词下推(Predicate Pushdown):逻辑优化器将查询语句中的谓词(过滤条件)下推到数据源,以减少数据的读取量和计算量。
- 连接重排(Join Reordering):逻辑优化器根据查询语句中的连接操作,尝试重新排列连接的顺序,选择更优的连接顺序,以减少中间结果的大小和计算量。
- 子查询优化(Subquery Optimization):逻辑优化器对查询语句中的子查询进行优化,如转化为连接操作、使用嵌套循环连接等,以减少子查询的计算量。
- 聚合推导(Aggregate Deduction):逻辑优化器根据查询语句中的聚合操作,尝试推导出部分聚合结果,以减少计算量和数据传输开销。
- 条件推断(Predicate Inference):逻辑优化器根据查询语句中的条件和约束,推断出更多的条件,以进一步减少数据的读取量和计算量。
逻辑优化器通过这些优化技术,对查询进行重写和重组,以减少不必要的计算和数据传输,提高查询的性能和效率。这些优化技术可以根据查询的特点和数据的分布情况,自动应用于查询执行计划的生成过程中。
Hive的架构原理可以概括如下:
总的来说,Hive的架构原理是将用户提交的查询语句进行编译、优化和执行计划生成,然后通过底层的存储和计算引擎进行数据的存储和处理。通过Hive的元数据存储和查询优化技术,用户可以使用类似于SQL的语言对大规模的结构化数据进行分析和处理。
JDBC和ODBC的区别:
- JDBC的移植性比 ODBC 好(通常情况下,安装完ODBC 驱动程序之后,还需要经过确定的配置才能够应用。而不相同的配置在不相同数据库服务器之间不能够通用。所以,安装一次就需要再配置一次。JDBC只需要选取适当的JDBC 数据库驱动程序,就不需要额外的配置。在安装过程中,JDBC 数据库驱动程序会自己完成有关的配置)
- 两者使用的语言不同,JDBC 在Java编程时使用,ODBC一般在C/C++编程时使用
把元数据存储在客户端进程内嵌的一个derby数据库,这个数据库是这个进程专有独享的,其他客户端无法使用
准备工作
# 启动集群
myhadoop.sh start
# 查看集群启动情况
jpsall
下载解压(均在Hadoop102上)
如遇过期请到这里点击下载bin.tar.ge文件然后复制下载链接(阿里镜像站,下载失败就找他)
# 下载在/opt/software/
wget https://mirrors.aliyun.com/apache/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz?spm=a2c6h.25603864.0.0.3462158fKLAMVw
# 解压
tar -zxvf /opt/software/apache-hive-3.1.3-bin.tar.gz -C /opt/module
# 改名
mv apache-hive-3.1.3-bin/ hive
在/etc/profile.d/my_env.sh
添加环境变量
#HIVE_HOME
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/bin
刷新一下环境
source /etc/profile.d/my_env.sh
初始化元数据库(默认是derby数据库)
cd /opt/module/hive;bin/schematool -dbType derby -initSchema
cd /opt/module/hive/lib
mv log4j-slf4j-impl-2.17.1.jar log4j-slf4j-impl-2.17.1.jar.bak
又出Bug了(执行初始化命令时发生报错是因为hadoop和hive的两个guava.jar
版本不一致)
解决方案:删除+复制
rm -rf /opt/module/hive/lib/guava-19.0.jar; cp -r /opt/module/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /opt/module/hive/lib/
hive,启动!
hive
# 测试一下
show databases;
# 卸载重装
rm -rf hive
tar -zxvf /opt/software/apache-hive-3.1.3-bin.tar.gz -C /opt/module
hive> show tables;
hive> create table stu(id int, name string);
hive> insert into stu values(1,"ss");
hive> select * from stu;
通过HDFS网页端Hadoop102上查看建表情况点击前往,在mapreduce中也能看到点击前往
没有Yarn上提交任务,因为对于简单的查询语句(无需计算)hive进行了优化
Hive中的表在 Hadoop中是目录;Hive中的数据在Hadoop中是文件
尝试:另一个窗口开启Hive,在/tmp/root
目录下监控hive.log
文件,发现不行!
# 首先退出hive客户端。然后在Hive的安装目录下将derby.log和metastore_db删除,顺便将HDFS上目录删除
hive> quit;
rm -rf /root/derby.log /opt/module/hive/metastore_db
离线安装MySQL详见MySQL安装指南点击前往
# 在/usr/local/mysql目录下再安装一个包
rpm -ivh mysql-community-libs-compat-8.0.34-1.el7.x86_64.rpm
如果报错提示有依赖包没有下载,则前往Packages for Linux and Unix点击前往
MySQL,启动!
systemctl start mysqld ; systemctl status mysqld
配置MySQL
# 查看MySQL默认初始密码
cat /var/log/mysqld.log | grep password
# 查询user表
select user,host from user;
# 修改user表,把Host表内容修改为%,使得任意节点均可访问
update user set host="%" where user="root";
# 刷新权限
select user,host from user;
新建元数据库
create database metastore;
下载MySQL的JDBC驱动到Hive的lib目录下
# 由于上次mycat下载过相应版本的驱动jar包mysql-connector-j-8.1.0.jar
cp /usr/local/mycat/lib/mysql-connector-j-8.1.0.jar /opt/module/hive/lib/
驱动jar包==>mysql-connector-j-8.1.0.jar下载详见
在/opt/module/hive/conf
目录下新建hive-site.xml
文件:vim /opt/module/hive/conf/hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://192.168.150.103:3306/metastore?createDatabaseIfNotExist=truevalue>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.cj.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>rootvalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>lovexw999value>
property>
<property>
<name>hive.metastore.warehouse.dirname>
<value>/user/hive/warehousevalue>
property>
configuration>
初始化Hive元数据库(修改为采用MySQL存储元数据)
cd /opt/module/hive/;bin/schematool -dbType mysql -initSchema -verbose
在三检查避免出Bug:
- jdbc连接的URL:要符合自己情况的!!
- jdbc连接的Driver:在Mysql 8及以上版本中,驱动类已经从com.mysql.jdbc.Driver改为com.mysql.cj.jdbc.Driver,在Mysql 8及以上版本中,虽然兼容老版本,但是推荐新的
- 驱动jar包:要找到对应当前MySQL版本的jar包
- jdbc连接的password:免密登录的要改过,详见这里
验证元数据是否配置成功
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;
# 开启另一个窗口开启Hive(两个窗口都可以操作Hive,没有出现异常)
hive> show databases;
hive> show tables;
hive> select * from stu;
查看元数据库中存储的库信息(打开DG)
表名 | 说明 |
---|---|
BUCKETING_COLS | 存储bucket字段信息,通过SD_ID与其他表关联 |
CDS | 表示该分区、表存储的字段信息。一个字段CD_ID,与SDS表关联 |
COLUMNS_V2 | 表示该分区、表存储的字段信息。存储字段信息,通过CD_ID与其他表关联 |
DATABASE_PARAMS | 描述数据库的属性信息 |
DBS | 存储hive的database信息 |
DB_PRIVS | 描述数据库的权限信息 |
FUNCS | 记录用户子集编写的函数信息,包括函数名、对应类名、创建者信息等 |
FUNC_RU | 记录自定义函数所在文件的路径 |
GLOBAL_PRIVS | 全局变量,与表无关 |
IDXS | Hive中索引的信息 |
PARTITIONS | 分区信息,SD_ID, TBL_ID关联 |
PARTITION_KEYS | 存储分区字段列,TBL_ID关联 |
PARTITION_KEY_VALS | 分区的值,通过PART_ID关联。与PARTITION_KEYS共用同一个字段INTEGER_IDX来标示不同的分区字段。 |
PARTITION_PARAMS | 存储某分区相关信息,包括文件数,文件大小,记录条数等。通过PART_ID关联 |
PART_COL_PRIVS | 分区列的授权信息 |
PART_COL_STATS | 分区中列的统计信息 |
ROLES | 角色表,和GLOBAL_PRIVS配合,与表无关 |
SDS | 存储输入输出format等信息,包括表的format和分区的format。关联字段CD_ID,SERDE_ID |
SEQUENCE_TABLE | 存储sqeuence相关信息,与表无关 |
SERDES | 存储序列化反序列化使用的类 |
SERDE_PARAMS | 序列化反序列化相关配置信息,通过SERDE_ID关联 |
SKEWED_COL_NAMES | 保存表、分区由数据倾斜的列信息,包括列名 |
SKEWED_STRING_LIST | 保存表,分区有数据倾斜的字符串列表和值的信息 |
SKEWED_STRING_LIST_VALUES | 保存表,分区有数据倾斜的字符串列表和值的信息 |
SKEWED_VALUES | 保存表、分区倾斜列对应的本地文件路径 |
SORT_COLS | 排序字段,包括列名和排序方式。通过SD_ID关联 |
TABLE_PARAMS | 表相关信息,是否外部表,通过TBL_ID关联 |
TAB_COL_STATS | 表中列的统计信息,包括数值类型的最大和最小值 |
TBLS | 存储表信息,关联字段DB_ID,SD_ID |
TBL_COL_PRIVS | 表或视图中列的授权信息,包括授权用户、被授权用户和授权的权限等 |
TBL_PRIVS | 表赋权限相关信息,通过TBL_ID关联 |
VERSION | 版本 |
VERSION_copy | 版本,通过VER_ID关联 |
提供jdbc/odbc
接口,为用户提供远程访问Hive数据的功能,例如用户期望在个人电脑中访问远程服务中的Hive数据,就需要用到Hiveserver2
访问hadoop集群身份说明
hive.server2.enable.doAs
参数决定(默认开启),该参数的含义是是否启用Hiveserver2用户模拟的功能。若启用,则Hiveserver2会模拟成客户端的登录用户去访问Hadoop集群的数据,不启用,则Hivesever2会直接使用启动用户访问Hadoop集群数据。模拟用户的功能,默认是开启的生产环境,推荐开启用户模拟功能,因为开启后才能保证各用户之间的权限隔离
hiveserver2部署:hivesever2的模拟用户功能,依赖于Hadoop提供的proxy user
(代理用户功能),只有Hadoop中的代理用户才能模拟其他用户的身份访问Hadoop集群。因此,需要将hiveserver2的启动用户设置为Hadoop的代理用户,配置方式如下:
1️⃣hadoop102中/opt/module/hadoop/etc/hadoop/core-site.xml
<property>
<name>hadoop.proxyuser.root.hostsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.root.groupsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.root.usersname>
<value>*value>
property>
分发core-site.xml
文件xsync core-site.xml
并重启集群myhadoop.sh stop/start
2️⃣Hive端配置:hive-site.xml
文件中添加如下配置信息
<property>
<name>hive.server2.thrift.bind.hostname>
<value>hadoop102value>
property>
<property>
<name>hive.server2.thrift.portname>
<value>10000value>
property>
启动hiveserver2:
# 启动服务(这样启动会阻塞,一旦关闭该窗口就会挂掉服务)
cd /opt/module/hive/;bin/hive --service hiveserver2
# 实际生产环境这样启动,退到后台运行
nohup bin/hiveserver2 1>/dev/null 2>/dev/null &
# 查看进程详细信息
jps -ml
使用命令行客户端beeline进行远程访问:
# 启动
cd /opt/module/hive;bin/beeline -u jdbc:hive2://hadoop102:10000 -n root
# 连接上hive
!connect jdbc:hive2://hadoop102:10000
# 退出
!quit
Hive的
metastore
服务的作用是为Hive CLI
或者Hiveserver2
提供元数据访问接口
生产环境中,不推荐使用嵌入式模式。因为其存在以下两个问题:
1️⃣嵌入式模式下,每个Hive CLI都需要直接连接元数据库,当Hive CLI较多时,数据库压力会比较大。
2️⃣每个客户端都需要用户元数据库的读写权限,元数据库的安全得不到很好的保证。
metastore部署
Hive CLI
的配置文件hive-site.xml
中包含连接元数据库所需要的以下参数即可
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://hadoop102:3306/metastore?useSSL=falsevalue>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>rootvalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>123456value>
property>
1️⃣首先,保证metastore服务的配置文件hive-site.xml中包含连接元数据库所需的以下参数
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://hadoop102:3306/metastore?useSSL=falsevalue>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>rootvalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>123456value>
property>
2️⃣其次,保证Hiveserver2和每个Hive CLI
的配置文件hive-site.xml
中包含访问metastore服务地址:
<property>
<name>hive.metastore.urisname>
<value>thrift://hadoop102:9083value>
property>
注意:主机名需要改为metastore服务所在节点,端口号无需修改,metastore服务的默认端口就是9083
独立服务模式测试(102部署服务,103客户端)
# 将hive拷贝到103
scp -r /opt/module/hive/ hadoop103:/opt/module/
# 在102上启动metastore
nohup hive --service metastore &
# 查看启动情况
jps -ml
# 修改103上hive-site.xml文件,删除服务端相关代码,添加访问metastore服务地址
ssh hadoop103
cd /opt/module/hive;vim conf/hive-site.xml
# 103启动hive
hive
show tables;
关闭102服务之后,103不能查询到数据库,因为设置了连接服务地址
# 执行语句
hive -e "select * from stu"
# 执行sql文件
hive -f stu.sql
查看当前所有的配置信息:set
参数配置的三种方式:
hive-site.xml
,用户自定义配置会覆盖默认配置。另外,Hive也会读入Hadoop的配置,因为Hive是作为Hadoop的客户端启动的,Hive的配置会覆盖Hadoop的配置。配置文件的设定对本机启动的所有Hive进程都有效-hiveconf param=value
来设定参数,仅对本次Hive启动有效bin/hive -hiveconf mapreduce.job.reduces=10;
# 查看配置情况
hive (default)> set mapreduce.job.reduces;
hive (default)> set mapreduce.job.reduces=10;
# 查看配置情况
hive (default)> set mapreduce.job.reduces;
上述三种设定方式的优先级依次递增。即
配置文件 < 命令行参数 < 参数声明
。注意某些系统级的参数,例如log4j
相关的设定,必须用前两种方式设定,因为那些参数的读取在会话建立以前已经完成了
如何在Hive客户端显示当前库和表头?在hive-site.xml
中加入如下两个配置
<property>
<name>hive.cli.print.headername>
<value>truevalue>
<description>Whether to print the names of the columns in query output.description>
property>
<property>
<name>hive.cli.print.current.dbname>
<value>truevalue>
<description>Whether to include the current database in the Hive prompt.description>
property>
Hive运行日志路径配置:Hive 的 log 默认存放在/tmp/root/hive.log
目录下(当前用户名下)
,修改Hive 的 log存放日志到/opt/module/hive/logs
# 修改/opt/module/hive/conf/hive-log4j2.properties.template文件名称为hive-log4j2.properties
cd /opt/module/hive/conf
mv hive-log4j2.properties.template hive-log4j2.properties
# 在hive-log4j2.prope、、rties文件中修改log存放位置
vim hive-log4j2.properties
property.hive.log.dir=/opt/module/hive/logs
Hive的JVM堆内存设置:新版本的Hive启动的时候,默认申请的JVM堆内存大小为256M,JVM堆内存申请的太小,导致后期开启本地模式(内存就不够了),执行复杂的SQL时经常会报错:java.lang.OutOfMemoryError: Java heap space
,因此最好提前调整一下HADOOP_HEAPSIZE
这个参数
# 修改$HIVE_HOME/conf下的hive-env.sh.template为hive-env.sh
cd /opt/module/hive/conf
mv hive-env.sh.template hive-env.sh
# 将hive-env.sh其中的参数 export HADOOP_HEAPSIZE修改为2048,重启Hive
# The heap size of the jvm stared by hive shell script can be controlled via:
export HADOOP_HEAPSIZE=2048
关闭Hadoop虚拟内存检查(hadoop课程配置过):在hadoop中yarn-site.xml
关闭虚拟内存检查(虚拟内存校验,如果已经关闭了,就不需要配了),修改前记得先停Hadoop:myhadoop.sh stop
,在yarn-site.xml
添加如下配置:
<property>
<name>yarn.nodemanager.vmem-check-enabledname>
<value>falsevalue>
property>
最后分发yarn-site.xml
,并重启yarn
✍命令行客户端beeline是Apache Hive提供的一个交互式工具,用于与Hive进行交互式的数据库操作和查询。具体来说,beeline允许用户通过命令行界面连接到Hive服务器,并在该界面下执行Hive SQL语句、查看查询结果、管理数据库和表等。
使用beeline,可以方便地在终端窗口中与Hive进行交互,它提供了以下功能:
总结来说,beeline是一个用于在命令行界面下进行与Hive交互的工具,可以帮助用户方便地执行Hive查询和管理数据库操作
✍下一站,DDL、DML!