HIVE原理
1. Hive简介
MR程序编写较难
SQL编写容易
1.1 总结与思考⭐
1)对MR程序的封装,使用SQL就能使用HIVE数据仓库
2. 什么是数据仓库
2.1 数据仓库面向主题
2.2 数据仓库随时间变化
2.3 数据仓库相对稳定
2.4 总结与思考⭐
1)OLTP和OLAP的对比
3. 数据仓库的结构
3.1 数据源
内部信息:业务数据库,自动化系统包含的数据
外部数据:市场信息,竞争对手,法律法规,外部统计数据等
3.2 数据存储及管理
-
数据仓库用于分析,当要分析某个主题时,会把这个主题相关的所有数据抽取过来
-
这些数据可能来自不同系统,数据格式不统一,所以要进行转换
-
数据仓库可以划分为企业级和部门级
-
数据集市可以理解为小型的部门或者工作级别的数据仓库
3.3 OLAP服务器
3.4 前端工具
3.5 总结与思考⭐
1)数据仓库结构图
4. 数据仓库的数据模型
4.1 星型模型
-
星型模型以一个事实表和一组维度表组合而成
-
以事实表为中心,关联维度表而成
4.2 雪花型模型
多层维度表,实际效率并不高,实际应用中较少使用
4.3 总结与思考⭐
1)星型模型:一个实体对应一组维度表,实际开发运用较多
2)雪花模型:一个实体对应多组维度表,效率不高,实际运用较少
5. Hive简介
5.1 什么是HIVE
1)hive建立在HDFS之上,对HDFS中数据进行ETL
2)将结构化数据映射为一张数据表
3)HIVE并不是一个数据库
5.2 HIVE系统架构
CLI / JDBC / WEB UI: 用户接口
CLI:命令行界面
Thrift Server: 跨语言服务
DRIVER: 底层驱动引擎
Metastore:元数据存储系统
5.2.1 用户接口
5.2.2 跨语言服务
5.2.3 底层驱动引擎
5.2.4 元数据存储系统
5.3 总结与思考⭐
1)HIVE结构图
2)HIVE组件
用户接口:CLI/JDBC/ODBC/WEB UI
跨语言服务:Thrift Server,不同语言转换为java以调用HIVE接口
底层驱动引擎:Driver,有编译器(Compiler),优化器(Optimizer),执行器(Executer)组成
元数据存储:Metastore,将表的表,列,分区,目录等元数据信息,存储在Mysql数据中
6. HIVE工作原理
UI向Driver发送查询操作(经过Thrift跨语言服务的翻译)
DRIVER借助编译器解析查询,获取查询计划
编译器将获取元数据的请求发送给metastore
metastore以响应的方式,发送给编译器
编译器检查需求,并将计划重新发送给DRIVER
DRIVER将执行计划发送给执行引擎
执行引擎从datanode中获取结果,并将结果发送给DRIVER和UI
6.1 总结与思考⭐
1)具体参考以上
7. HIVE数据模型
7.1 数据库
类似于关系型数据库中的数据库
7.2 表
7.3 分区
7.4 桶表
加载桶表时,会对字段值进行哈希取值,然后除以桶个数得到余数进行分桶
物理上,每个桶表就是表或分区的一个文件
分桶就是分文件
7.5 总结与思考⭐
1)HIVE数据模型
2)表:外部表,内部表;外部表,直接引用HIVE以外的HDFS表,只建立元数据信息,删除也只删除元数据;内部表,直接存储在HIVE中
分区:独立的列
桶表:桶是HIVE的最小单元,数据加载到桶表时,会根据字段HASH值对分桶个数取模,莫值就是分桶的位置;物理上,每个桶表示成具体的一个文件
8. HIVE安装模式
1)嵌入模式
2)本地模式
3)远程模式
8.1 嵌入模式
8.1.1 下载解压HIVE安装包
8.2 本地模式和远程模式
8.2.1 安装MYSQL
8.2.2 HIVE配置
1)修改hive-env.sh配置
2)修改hive-site.xml,配置mysql
8.3 总结与思考⭐
1)嵌入模式,本地模式,远程模式,主要在于配置文件的编写
9. HIVE的管理方式
9.1 HIVE的管理之CLI方式
9.2 HIVE的管理之远程服务
9.3 总结与思考⭐
1)bin/hiveserver2 启动hive
2)CLI终端管理;远程服务连接,远程连接命令:/bin/beeline,!connect jdbc:hive2://hadoop01:10000
10. HIVE的内置数据类型
10.1 基本的数据类型
10.2 复杂的数据类型
10.3 总结与思考⭐
1)基本的数据类型
2)复杂的数据类型
11. HIVE数据库操作
11.1 HIVE内部表操作
11.2 HIVE外部表操作
创建外部表,不需要移动结构化文件。
遇到大文件导入时,可以使用外部表来操作。
创建外部表时,加入location '/stu'
11.3 HIVE内部表和外部表区别
11.4 HIVE的分区表操作
11.4.1 普通分区
分区表插入输入不能使用Hadoop移动命令,需要使用Load命令
新增分区
1.1.新增分区
1.2 修改分区
1.3 删除分区
11.4.2 动态分区
11.5 总结与思考⭐
1)创建外部表extenal关键字
2)外部表和内部表的区别
3)分区表操作:分区表插入输入不能使用Hadoop移动命令,需要使用Load命令
4)动态分区,以最后两个字段的值分区
12. HIVE桶表操作
1.开启分桶
2.设置分桶个数,保持与ReduceTask一致
3.clustered by(分桶字段)
4.into 4 buckets ---- 拿分桶字段的HASH值跟分桶个数取莫,余数就是分桶编号
给分桶表加载数据
1.先创建临时表,给临时表加载数据
2.再通过临时表,向分桶表插入数据
12.1 桶表优化
在join时,如果两个表有相同字段,且对两个表都进行了分桶操作,那么查询效率会提升
大规模数据集,选择小部分数据集抽样运算,也可以使用分桶
12.2 总结与思考⭐
1) 创建桶表
2)加载数据
3)总结
13. HIVE数据操作
13.1 HIVE查询
13.1.1 查询优化
distrubute by 结合 sort by == cluster by
13.1.2 基本查询(重要)
仅reduce内排序,没有全局排序
distribute by 一定要分配多个reduce进行处理,否则无法看到distribute by 效果
13.2 总结与思考⭐
1)基本查询
2)查询优化
distrubute by 结合 sort by == cluster by,distribute by 一定要分配多个reduce进行处理,否则无法看到distribute by 效果
3)hive性能优化
- 业务层面:通过梳理业务逻辑,看业务逻辑有没优化的地方,或者加入限定的条件,减少连接表的数据量;控制连接表的个数,增加临时中间表
- 技术层面:通过小文件个数,控制map任务的个数,防止map个数过多;调整maxsize,minsize,splitsize,map,reduce等参数控制map,reudce的个数;调整溢写内存和百分比,减少溢写的次数,提高shffule阶段的效率;对表进行分区,分桶,适用对某些特定字段查询的场景;使用cluster by进行排序;