基于hadoop,数据存储在hdfs上并且对客户端提供hql支持,将hql语句转换为mapreduce任务的数仓工具
存储数据更加像一个数据的管理工具,用户存储各种用于分析的数据 存储的数据量比较庞大的、结构复杂的 、大数据集的管理工具
介绍两种场景,OLTP和OLAP:
OLTP On line Transaction Processing 联机事务处理,倾向于增 删 改
OLAP On line analysis Processing 联机分析处理,倾向于查询
数据仓库:不擅长事务,hive不支持事务;
数据库:mysql支持事务
结构化的一条数据-----表中一行数据
结构化每一个字段-----表中的一个列
对客户端提供hql查询
hql----mapreduce
节省开发成本
这其实是hadoop的特点,因为hive是构建与hdfs之上,所以它继承了这个特点
hive中接口层有以下几种:
将其他语言转换为hive能够识别的语言
元数据是描述hive真实存储数据的数据
hive中表的相关信息(除了表数据以外的信息)
表和hdfs数据的路径对应关系;
表中的字段类型;
表中字段的顺序;
表的创建时间等这些信息就叫做hive的元数据信息
hive的元数据信息存储的时候采用格式化存储,存储在关系型数据库中,默认的元数据存储数据库derby ,derby存储的时候有缺陷,一般生产上换成mysql
hive表数据存储hdfs,元数据存储在关系型数据库
Driver是将hql转化为mapreduce执行的的组件,它由以下几个部分组成:
解释器的作用是将 HiveSQL语句转换为抽象语法树(AST);
解释hql语句中的核心的关键词,例如:select group by order by limit 等
编译器是将语法树编译为逻辑执行计划;
一个hql语句会转换为多个mapreduce任务,即多个job 。
优化器是对逻辑执行计划进行优化
执行器是调用底层的运行框架执行优化器优化完成的结果
同mysql中的数据库,将数据进行细化管理,不同业务模块的数据放在一个数据库中,进行分库分表,hive中不同的模块的数据一般要放在不同的数据库中,便于数据管理。
管理权限是hive自己,hive对表中的数据(原始数据)有绝对的增删权限,
内部表在进行删除表的时候表中的数据(hdfs对应的目录)会被删除,元数据也会被删除。
外部表更像一个hdfs的数据使用者,使用的数据管理权限hdfs自己管理,对hive来说只有使用权限;
外部表在进行删除表的时候,元数据会被删除,表中的数据(hdfs) hdfs对应的数据不会被删除。
总结: 内部表和外部表最本质的一个区别就是删除表的时候,外部表的数据不会被删除,内部表的数据会被删除;内部表或外部表删除表的时候元数据都会被删除。
一个表中的数据很多,比如有1T的数据:
user (id,name,address,age,sex)
然后在这个表中查询age=18的人
sql实现:
select * from user where age=18;
如果所有数据全部存储在一个普通表中,执行上面的语句的时候,全表扫描才能得到我们最终想要的结果,最终执行效率很低
那么如何提升查询性能呢?
答案是缩小查询范围,从数据存储开始入手,按照年龄将我们的数据分成不同的“小表”存储
/user
/age=18
/age=17
/age=16
/age=34
…
不同表中存储的就是不同年龄的数据,这个时候再进行执行sql语句
select * from user where age=18;
只会扫描/user/age=18 减少了扫描范围,提升了查询性能
上面的案例中每一个年龄对应的一个“小表”称为一个分区,user表被分成了很多的分区,这个user表就称为分区表。
分区表作用: 减少扫描范围,提升查询性能
一般怎么样进行分区:
select * from user where address="河南" and sex="男";
分区字段: address+ sex
/address /sex
select * from user where age=20; 全表扫描
两个表:
a (id name) 10T数据量
b(id age) 1T数据量
此时进行两表关联:
select * from a join b on a.id=b.id;
将这两个表进行分区,分区字段为唯一的id,这样的话会分很多的分区,每一个分区中只有一条数据,所以这样是没有意义的。
解决思路:
将两个表都按照统一的规则切分,每一切分的小文件称为一个桶,这两个表就是分桶表,分桶依据是分桶算法,关联建.hash % 分桶个数,最终相同的关联建 在两个表中的对应的桶一样的。
作用:
1)为了提升关联查询的性能
关联的时候对两个表进行分桶个数限制:相同或倍数关系
2)提升抽样查询的性能
抽样即随机性,一个桶的数据就可以认为一个抽样的样本数据
分桶表的数据存储:
不同分桶表对应的是不同的文件
/user
分桶 id 桶的个数 3
存储的时候:
/user/part-r-00000
/user/part-r-00001
/user/part-r-00002
一个视图代表的就是一个查询语句
craete view view_name as select ....
select * from view_name;
select ...
from
select ..from
select ..from ....
select ...
from
select ..from
view_name
hive表的描述信息是存储在关系型数据库中,默认derby中,一般都会改为 mysql中jdbc:mysql://localhost:3306/test?createDatabaseIfNotExist=true
上面举的例子的元数据存储mysql的test库中。
hive表中包括:
2 hdfs://bd1901/user/hive/warehouse/test.db test hadoop USER
字段描述:
hive每一个数据库存储的hdfs位置,数据库的操作用户|角色;
每当在hive中创建一个数据库这个表中就会添加一条数据
1 1558077151 2 0 hadoop 0 1 test01 MANAGED_TABLE 0
字段描述:
表的id,表的创建时间,表的所属用户,表所属数据库,表的类型(managed_table external_table virtual_view)
每当在hive中创建一个表,这个表中就会添加一条数据
表字段信息的描述——columns_v2 :
描述的表的字段信息,每一个字段一行,表的字段名,类型,顺序,所属表
总结:
hive的元数据可以修改一定要慎重修改,hive最终显示的表结构信息全部读取mysql中的元数据来的,元数据一旦修改表结构就会修改!
存贮在hdfs的默认存储路径:
/user/hive/warehouse/
默认的hive-default.xml
<property>
<name>hive.metastore.warehouse.dirname>
<value>/user/hive/warehousevalue>
<description>location of default database for the warehousedescription>
property>
可以修改的,在hive-site.xml 添加
<property>
<name>hive.metastore.warehouse.dirname>
<value>/user/myhive/warehousevalue>
<description>location of default database for the warehousedescription>
property>
注意: 修改只能改变以后的建表,以前的表该存储哪里就存在哪里
1)延时性高,因为是基于hadoop的;
2)hive对事物的支持很弱,一般不使用;
3)hive不支持update、delete,hdfs不支持修改
支持insert,将insert的数据写入一个新的文件,但是效率低
延展性好,内部提供了271个内置函数,支持自定义函数