hive学习(一)之Hive简介和数据组织形式

一、hive是什么

基于hadoop,数据存储在hdfs上并且对客户端提供hql支持,将hql语句转换为mapreduce任务的数仓工具

二、hive的特点

1、Hive是由Facebook实现并开源的

2、Hive是基于Hadoop的一个数据仓库工具

2.1基于hadoop主要是以下两个方面

  • hive中的表中的数据存储在hdfs上,存储完全依赖于hdfs;
  • hive最终计算使用的默认mapreduce,资源调度使用yarn。

2.2数据仓库工具(data warehouse,简称DW)

存储数据更加像一个数据的管理工具,用户存储各种用于分析的数据 存储的数据量比较庞大的、结构复杂的 、大数据集的管理工具

2.2.1数据库和数据仓库的区别

  • 数据库中一般存储某一个分析结果——强调的是结果
  • 数据仓库是面向主题的——强调的是过程
    例如:数据分析过程,各个层级的数据
    原始日志flow.log
    抽层 :
    etl
    原始数据加工
    细化 将需要分析的字段 抽出来 存储在一个个表中
    分析基于仓库中的数据
①使用场景上

介绍两种场景,OLTP和OLAP:
OLTP On line Transaction Processing 联机事务处理,倾向于增 删 改
OLAP On line analysis Processing 联机分析处理,倾向于查询

  • 数据库:更加倾向于OLTP
  • 数据仓库:更加倾向于OLAP
    hive不支持数据delete update,支持insert但是insert的效率极低
②模式上
  • 数据库mysql --写模式
    数据写入的时候校验
  • hbase/nosql --无严格模式
  • 数据仓库hive—读模式
    数据读取的时候校验
③事务支持上

数据仓库:不擅长事务,hive不支持事务;
数据库:mysql支持事务

3、可以将结构化的数据映射为一张数据库表

结构化的一条数据-----表中一行数据
结构化每一个字段-----表中的一个列

4、提供 HQL(Hive SQL)查询功能

对客户端提供hql查询

5、底层数据是存储在 HDFS上

6、Hive的本质是将 SQL 语句转换为 MapReduce任务运行

hql----mapreduce

7、使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据

节省开发成本

8、适用于离线的批量数据计算

这其实是hadoop的特点,因为hive是构建与hdfs之上,所以它继承了这个特点

三、Hive架构

1、用户接口层

hive中接口层有以下几种:

  • CLI 命令行 hive
  • JDBC/ODBC
  • java程序操作hive
  • web ui,不过网页访问一般不用,因为界面不美观和配置繁琐

2、trift server层——跨语言服务层

将其他语言转换为hive能够识别的语言

3、元数据存储层 meta store

元数据是描述hive真实存储数据的数据
hive中表的相关信息(除了表数据以外的信息)
表和hdfs数据的路径对应关系;
表中的字段类型;
表中字段的顺序;
表的创建时间等这些信息就叫做hive的元数据信息

hive的元数据信息存储的时候采用格式化存储,存储在关系型数据库中,默认的元数据存储数据库derby ,derby存储的时候有缺陷,一般生产上换成mysql
hive表数据存储hdfs,元数据存储在关系型数据库

4、核心驱动层Driver

Driver是将hql转化为mapreduce执行的的组件,它由以下几个部分组成:

①解释器

解释器的作用是将 HiveSQL语句转换为抽象语法树(AST);
解释hql语句中的核心的关键词,例如:select group by order by limit 等

②编译器

编译器是将语法树编译为逻辑执行计划;
一个hql语句会转换为多个mapreduce任务,即多个job 。

③优化器

优化器是对逻辑执行计划进行优化

④执行器

执行器是调用底层的运行框架执行优化器优化完成的结果

四、hive的数据组织形式

1、库

同mysql中的数据库,将数据进行细化管理,不同业务模块的数据放在一个数据库中,进行分库分表,hive中不同的模块的数据一般要放在不同的数据库中,便于数据管理。

2、表

2.1根据hive数据的管理权限分

①内部表

管理权限是hive自己,hive对表中的数据(原始数据)有绝对的增删权限,
内部表在进行删除表的时候表中的数据(hdfs对应的目录)会被删除,元数据也会被删除。

②外部表

外部表更像一个hdfs的数据使用者,使用的数据管理权限hdfs自己管理,对hive来说只有使用权限;
外部表在进行删除表的时候,元数据会被删除,表中的数据(hdfs) hdfs对应的数据不会被删除。
总结: 内部表和外部表最本质的一个区别就是删除表的时候,外部表的数据不会被删除,内部表的数据会被删除;内部表或外部表删除表的时候元数据都会被删除。

2.2按照功能分

①分区表

一个表中的数据很多,比如有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; 全表扫描 
  • 分区表的存储:
    普通表数据的存储:
    hdfs: /user/hive/warehouse/数据库/表/数据文件
    分区表:不同目录
    hdfs: /user/hive/warehouse/数据库/表/age=18/
    /user/hive/warehouse/数据库/表/age=19/
    /user/hive/warehouse/数据库/表/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

3、视图

一个视图代表的就是一个查询语句

craete view view_name as select ....
  • 1)hive中的视图只存在逻辑视图没有物化视图,仅仅将视图代表的sql语句保存下来了
    物化视图: 将视图代表的sql查询语转换为执行结果
  • 2)视图只有在查询视图的时候开始真正实行视图代表的语句
select * from view_name;
  • 3)视图作用仅仅为了提升sql语句的可读性
select ...
		from 
			select ..from 
				select ..from ....
	select ...
		from 
			select ..from 
				view_name
  • 4)hive中的视图不支持insert/delete/update

4、数据存储文件

4.1元数据存储

hive表的描述信息是存储在关系型数据库中,默认derby中,一般都会改为 mysql中jdbc:mysql://localhost:3306/test?createDatabaseIfNotExist=true
上面举的例子的元数据存储mysql的test库中。
hive表中包括:

①数据库描述信息——DBS

2 hdfs://bd1901/user/hive/warehouse/test.db test hadoop USER
字段描述:
hive每一个数据库存储的hdfs位置,数据库的操作用户|角色;
每当在hive中创建一个数据库这个表中就会添加一条数据

②表的描述信息——TBLS

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>

注意: 修改只能改变以后的建表,以前的表该存储哪里就存在哪里

五、hive优缺点

1、缺点

1)延时性高,因为是基于hadoop的;
2)hive对事物的支持很弱,一般不使用;
3)hive不支持update、delete,hdfs不支持修改
支持insert,将insert的数据写入一个新的文件,但是效率低

2、优点

延展性好,内部提供了271个内置函数,支持自定义函数

你可能感兴趣的:(hive)