目录
1.hive的产生背景
-
mr处理的问题大部分针对于hdfs上的结构化数据的处理,对于结构化数据最好的处理方式是sql。 很多mr程序就可以转换为简单的sql就可以解决。
- hive就是针对hdfs上的结构化数据进行分析的数据仓库。
- 那么问题来了—hive可不可以完全替代mr?
不可以。hive只能替代mr中结构化数据,不过实际中也是结构化数据占多。
2.hive是什么?
hive是针对于hdfs的结构化数据进行离线分析的数据仓库。底层数据存在hdfs上,上层的计算引擎依赖于mr ,hive将sql语句转换为mr程序。(mr执行的时候需要yarn做调度)
hive实质是一款基于hdfs的mapreduce计算框架,对存储在hdfs中的数据进行分析和管理。
3.hive的特点
- Hive 由 Facebook 实现并开源
- 是基于 Hadoop 的一个数据仓库工具
- 可以将结构化的数据映射为一张数据库表
hive仅仅相当于一个hdfs上的结构化数据管理的工具,将hdfs上的结构化数据映射为一张二维表
hdfs:一行数据——一条数据
字段——数据库列
- 并提供 HQL(Hive SQL)查询功能,hql:方言版sql
- 底层数据是存储在 HDFS 上
hive仅仅相当于hdfs上数据的管理者,二维表形式进行
元数据概念:描述表信息的数据,用于记录hive上表的信息的数据
包括:表关联的hdfs数据路径,表的结构,表的字段等等
hive的元数据用关系型数据库存储的,默认的使用的是derby数据库,一般情况下我们都会进行修改,改为mysql数据库进行元数据存储。
- Hive的本质是将 SQL 语句转换为 MapReduce 任务运行
hive底层会保存很多map和reduce的模板 当执行sql语句的时候 就会将sql 解析为mr
- 使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据
- 适用于离线的批量数据计算。
4.数据库和数据仓库:
1.概念:
数据库更倾向于管理精细化数据,分库分表,不同的业务模块的数据存储在不同的库中,有事物的概, 用于存储结果数据
数据仓库更像一个箱子,什么都可以存储,进行数据的管理
2.使用:
数据库:sql 标准sql hbase:nosql
数据仓库:hive hql(sql的方言版)
3.用途上:
数据库:oltp On-Line Transaction Processing 增删改
数据仓库:olap On-Line analysis Processing 查询操作
hive中根本不支持delete update 支持insert 但性能不高
4.模式:
数据库:写模式
数据仓库:读
5.数据量上:
mysql/oracle/sql server:集中式
hive:分布式存储
5.Hive架构
- 用户接口层:
1)vcli 客户端 shell
采用交互形式使用hive命令行与hive进行交互,最常用(学习,调式,生产)
2)jdbc/odbc
是hive的基于JDBC操作提供的客户端,用户(开发员,运维人员)通过这连接至Hive service服务
3)Web ui 不用
通过浏览器访问hive
2.元数据存储
元数据:记录hive中表(数据)的描述信息
默认derby数据库 缺点:不适合多用户操作,并且数据存储目录不固定,数据跟着hive走,不方便管理。
生产中改成mysql
Hive和Mysql之间通过MetaStore服务交互
3.核心驱动层
利用hql进行驱动。
驱动器:
驱动整个hql的运行过程 hql-mr 对程序进行提交
编译器:
将hql翻译成mapreduce程序,hive的底层存储了很多的map reduce模板
将hql语句翻译成map reduce模板 进行运行
优化器:
编译器编译的时候仅仅是将hql转化为mr程序,没有从性能上考虑,不一定是最 优的方案。优化器进行优化,将重复的mr程序进行合并,最终达到一个最优的最 简单的优化方案。
(select * from stu) a join (select * from stu) b on ……
执行器:
将最终的优化的结果进行提交
4.Thrift Server
Thrift是Facebook开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发,hive集成了该服务,能让不同的编程语言调用hive的接口
6.hive的数据组织
1、库
跟Mysql中的库的概念一样,细化管理数据
2、表
内建表/内部表/管理表
外部表
分区表
分桶表
-
内部表和外部表
内部表和外部表是相互对立的概念,没有一个表既是内部表也是外部表
本质区别:(笔试)(Hive中的数据包括2种:原始数据+元数据(必须有))
内部表在进行删除表的时候,原始数据(hdfs)和元数据(mysql)一并删除
外部表在进行删除的时候,仅仅删除元数据,原始数据不删除
注意:外部表一般情况下有公共数据的时候使用
内部表:MANAGED_TABLE 默认情况下建的表都是内部表
外部表:EXTERNAL_TABLE 建外部表需要加关键字 external
- 分区表:
不同mr中的分区的概念
作用: 便于数据查询,减小查询的扫描范围,提升查询性能
hive的分区,就等于是细化管理一张表的所有数据。
// 普通表:(全盘扫描)
/user/hive/warehouse/mydb.db/person/beijing.txt 全国数据
//分区表:(仅仅会扫描北京这一个目录)
/user/hive/warehouse/mydb.db/person/city=beijing/beijing.txt 数据存在不同的目录下
/user/hive/warehouse/mydb.db/person/city=tianjin/tianjin.txt
- 分桶表:(对应mr中分区的概念,哈希)
结果数据存在不同的文件中
注意:分桶表是全表查询
/user/hive/warehouse/mydb.db/student/beijing.txt_1
/user/hive/warehouse/mydb.db/student/beijing.txt_2
或这样写更明白
/user/hive/warehouse/mydb.db/student/part-r-00000
/user/hive/warehouse/mydb.db/student/part-r-00001
分桶表作用:
- 提升抽样性能
- 提升join性能(连接查询的效率)
注意:(面试)
1、分区: 表示把数据分类, 分割开来进行存储
2、分桶: 跟MapReduce中的HashParititoner一模一样
3、视图
create view as select id,name from student limit 10;
- 视图:代表的是一条查询语句,这条查询语句的快捷方式
- 物化视图:
将视图代表的查询语句进行执行 获取执行结果 将结果存储在视图中
2. 逻辑视图:
仅仅存储的是sql语句 没有执行 逻辑视图的执行是在查询视图的时候进行执行 select * from my_view;
- hive中没有物化视图,只有逻辑视图
select * from (select id,name from student limit 10);
视图的作用提高sql语句的可读性 方便读取
- 注意:视图在性能上没有作用
4、数据存储
1. 真实数据存储的位置
Hive中的数据,是存储在HDFS上的某个目录中的。hive的数据存储在HDFS上,有一个统一的目录,这个目录可以改变。
- 在没有配置的情况下:
默认的hive数据仓库在HDFS上的根路径:/user/hive/warehouse
- 可配置存储路径,可更改hive-site.xml文件:
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/myhive/warehouse</value>
<description>hive default warehouse, if nessecory, change it</description>
</property>
2.元数据存储的位置—mysql
- 更改hive-site.xml文件:
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/myhive?createDatabaseIfNotExist=true</value>
</property>
此处配置的元数据的存储:mysql的myhive数据库
- mysql的myhive数据库中的表介绍
DBS:描述数据库信息的
一个数据库代表一条数据
TBLS:存储的表的相关信息 表名 表所属数据库
一个表 — 一条数据
COLUMNS_V2:表字段描述信息
最后一个字段代表数据的顺序索引
元数据存储在mysql中的
元数据可以修改,但是一定不要修改,一旦修改元数据,影响底层的表结构 可能造成数据会被修改