文章目录
1.Hive概述
hive时 hadoop一个数据仓库工具,可以将结构化数据映射为一张表,并提供SQL查询功能。
- Hive本质
重点:
hive会将用户使用的sql语句转换为MR程序。
由于最终运行程序还是在yarn上,因此hive也是yarn的客户端。
1.2.Hive架构原理
-
Metastore指的是元数据访问接口
-
Metastore只提供元数据访问接口,不提供元数据
-
HiveServer2提供JDBC或ODBC访问接口,或用户认证相关信息
-
HiveCLI只能在安装hive的本地机器使用,命令行客户端
-
Hive组件之间交互过程
Driver的运行逻辑就是将用户sql语句转化为MR计算程序;
此外driver编译sql语句需要用到元数据信息
若使用是select查询语句,那么hive客户端会拉取到最终的查询语句到客户端进行展示给用户。
1.3Driver
(1)解析器(SQLParser):将SQL字符串转换成抽象语法树(AST)
(2)语义分析(Semantic Analyzer):将AST进一步划分为QeuryBlock
获取hive中的元数据信息,将其赋值给QeuryBlock
将第一个AST进一步划分为 QeuryBlock
(3)逻辑计划生成器(Logical Plan Gen):将语法树生成逻辑计划
将语法树生产单一的逻辑计划组合
(4)逻辑优化器(Logical Optimizer):对逻辑计划进行优化
(5)物理计划生成器(Physical Plan Gen):根据优化后的逻辑计划生成物理计划
(6)物理优化器(Physical Optimizer):对物理计划进行优化Map join
(7)执行器(Execution):执行该计划,得到查询结果并返回给客户端
抽象语法树AST如下所示:
- 每一个token表示每一个节点
逻辑计划如下所示:
2.Hive最小化模式安装部署
-
最小化模式会将数据保存在derby数据库中部署如下所示
-
前置条件-安装hadoop集群3.1.3
- 上传hive安装包,尚硅谷给的资料有
-
解压到module
-
添加环境变量
etc/profile.d/my_env.sh
- 初始化元数据库默认是derby数据库
html
/schematool -dbType derby -initSchema
- 初始化完成后出现metastore_db就是存储数据的文件夹
- 当前hive初始化完成,能够使用的就是CLI客户端,执行命令/bin/hive
- 建表
建表是可以指定路径的,不指定则使用默认路径
默认存储user路径
路径存储到源数据库中
若我向stu表插入数据,那么hdfs该路径下出现该数据
- 插入一条数据进行测试
刚刚程序没有向Yarn提交任务
最小化模式部署的问题
- hive客户端最小化模式仅允许一个derby进程使用,也就是仅允许一个窗口开启hive
3.生产环境hive安装部署
derby数据库仅允许一个进程使用,生产环境一般将元数据使用Mysql数据库保存,这样允许多个客户端同时访问。解决了先前的问题。
- mysql安装
- 离线安装
- 在线安装(集群节点可以连接外网)
将尚硅谷资料的两个包上传到hadoop102的software
- 解压
html
tar -xf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
- 删除centos7自带的软件包
html
sudo rpm -qa | grep mariadb | xargs sudo rpm -e --nodeps
- 逐步安装mysql依赖
html
sudo rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
html
sudo rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
html
sudo rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
html
sudo rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
html
sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
- 启动mysql
- mysql启动命令
html
sudo systemctl start mysqld
- 第一次启动时查看mysql密码
html
sudo cat /var/log/mysqld.log | grep password
所有的mysql环境配置建议参考hive课程的MySQL部署
4.将hive的元数据存储到Mysql
4.1创建metastore源数据库放到mysql中
4.2将mysql的驱动拷贝到hive下的lib目录下
4.3hive中创建配置文件
4.4初始化hive源数据库
最终使用DG进行连接
元数据元数据就是存url的表
html
不论什么数据库,建表时候都存在默认路径。
而查询语句就是查询HDFS的路径的表,那么源数据库不论使用哪个,只要默认路径存在值,select就能查出来。
5.元数据库概述
- DBS,保存hive源数据库的信息
- TBLS,保存hive创建表的所有信息--跟表存储的相关信息存到SDS表中
- COLUMNS_v2表示存储字段相关数据
6.Hive服务的部署
6.1HiveServer2
作用为用户提供一个jdbc、odbc的接口,供用户远程访问Hive数据的功能
- HiveServer2部署前置条件,必须部署到能够往yarn提交任务,能够访问HDFS集群的节点上。
- 用户发起一个sql语句,hiveserver2接收将任务提交yarn,yarn进行MR程序将结果返回给用户
未启用模拟用户效果:不论你使用任何客户端提交任务,HiveServer2提交任务的user都是Hiveserver启动用户atguigu。
若开启模拟用户:提交客户端提交任务user使用当前客户端用户。
生产环境:推荐开启用户模拟功能,开启权限之后,才能够保证各个用户之间的权限隔离。
A操作B表
C操作D表
.
.
.
- Hive模拟用户权限配置在hadoop的core-site.xml中
注:上述配置完成后不要忘记分发core-sie.xml
-
重启集群
- hadoop103关闭yarn
htmlstop-yarn.sh
- hadoop102关闭dfs
htmlstop-dfs.sh
-
hive端配置hiveserver2连接的host,指定hiveserver2连接的端口号
具体配置参考Hive3.1.3教程world
- hiveserver2启动在bin下且是一个监听窗口,进程名为RunJar
- 查看更详细的进程信息:
html
jps -ml
- 使用nohub将监听进程挂载到后台使用,避免我们关闭ssh窗口连接的时候进程挂断。配合nohub一起使用的还有一个&
html
nohub bin/hiveserver2 &
- 进一步将日志丢进垃圾箱1>/dev/null
html
nohub bin/hiveserver2 1>/dev/null &
-
linux每一个进程启动之后都会打开很多文件,每一个文件都有一个文件描述符
- 0表示标准输入
- 1表示标准输出
- 2表示标准错误文件
- 若省略数字,默认标准输出
html>/dev/null #表示标准输出 == 1>/dev/null
- 若1和2去的是同一个地址,那么标准输出可以简化
htmlx nohub bin/hiveserver2 1>/dev/null 2>&1 &
- 2>&1等价2>/dev/null,因为2和1去的地址相同。
6.2Metastore
Metastore的作用是提供Hive CLI的元数据访问接口
-
MetasTore运行模式
-
1.嵌入式模式
嵌入式模式,是所有的CLI,HiveServer2直接访问Mysql元数据库
- 2.独立模式
独立模式,Metastore成为一个代理,所有客户统统访问代理即可,代理来进行访问元数据库,这样的好处:这样Metastore可以作为消息队列的作用,当数据量过载,Metasotre可以很好的减缓数据库压力。
7.HiveServer2使用
- 本案例使用DataGrip数据库管理工具连接hiveserver2
端口默认10000
修改name,其他密码没有设置不用填没事
7.1Metastore嵌入模式配置
- 嵌入模式也就是所有客户直接和mysql交互,因此直接配置url、driver、username、passwor即可。这些参数配置在hive-site.xml,此外,详细配置 参考hive文档。
7.2Metastore独立模式配置*
- 生产环境重点
-
独立模式所有的客户配置metastore地址即可,metastore配置jdbc客户端即可。
-
Metastore服务地址配置,端口号默认9083
将hive-site.xml中jdbc驱动信息修改为上述即可由嵌入模式转换为独立模式,
metastore节点仅需要在hive-site.xml配置jdbc即可
metastore启动命令
htmlhive --service metastore
- 若hive-site.xml同时配置了metastore地址和jdbc参数,那么优先访问MetaStore。
记忆方法:企业开发为Metastore独立模式运行
我们练习使用:嵌入模式,hadoop102为metastore,hiveserver2地址
关于离线数仓,一般使用脚本方式,非交互式使用模式,定期执行hive命令
- 非交互式命令
太他妈熟悉了
shell
hive -e "sql命令"
非交互式一般用在脚本中定时执行的命令,该命令执行完毕后,直接进行进程释放,不占用资源,离线数仓就是该设计。
shell
hive -f file.sql
- 若sql过多可以撰写sql文件,使用非交互式命令hive -f f表示file
8.hive常用的参数配置方式
- 默认配置
- 命令行参数配置
仅对本次启动有效
shell
bin/hive -hiveconf 要配置的参数=配置值
客户端CLI内部配置
9.hive人性化配置
- 所有配置在hive-site.xml
1.客户端显示当前库和表头
html
<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日志文件路径
hive-log4j2.properties文件在conf下,原先 是template,你可以将后缀去掉再更改。
hive-log4j2.properties文件进行配置
默认日志文件路径存储到temp/hive启动用户名下
hive.log文件
3.关于JVM堆内存的配置
- hive启动时默认堆内存申请256M
先将文件更名
html
mv hive-env.sh.template hive-env.sh