一.hive的架构:
hive架构分为四层,如下图所示:
1.用户接口层(最外层)
对外提供的有三种类型
1)cli 命令行客户端 最常用的方式
2)jdbc/odbc 用java api 连接hive数据库
3)web ui 基本上不用,因为太丑,并且用着比较麻烦
2.元数据库:保存元数据 一般情况下会选用传统的关系型数据库 用的最多的是mysql,默认为derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
3.thrift服务:用来提供一个跨语言的服务,hive数据仓库,能够解析的语言是sql,hive集成了该服务,能让不同的编程语言调用hive的接口。正因为有这个服务,我们才可以用java ,ruby,c语言来操作hive数据库
4.驱动层:
1)驱动器:驱动整个sql语句的运行 包含sql语句解析Mr程序,最终将mr程序提交到hadoop
2)编译器:将sql语句通过hive自带的map reduce 模板,编译成mr程序,首先生成一个
逻辑执行计划,再生成一个物理执行计划
3)优化器:在编译的过程中肯定会有很多sql转化的mr程序存在包含关系或者是重复的操作
在优化器中就可以将重复的操作过滤掉,最终程序提交的应该是最优的mr程序
二.hive的数据组织格式:
1.库:database
2.表:
1)内部表/管理表(managed table)【默认为内部表】
Hive的内部表与数据库中的Table在概念上是类似。每一个Table在Hive中都有一个相应的目录存储数据。例如一个表stu,它在HDFS中的路径为/user/hive/warehouse/stu,其中stu是在hive-site.xml中由${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的Table数据(不包括External Table)都保存在这个目录中。删除表时,元数据与数据都会被删除。
2)外部表(external table)
外部表指向已经在HDFS中存在的数据,可以创建Partition。它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异。内部表的创建过程和数据加载过程这两个过程可以分别独立完成,也可以在同一个语句中完成,在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。而外部表只有一个过程,加载数据和创建表同时完成(CREATE EXTERNAL TABLE ……LOCATION),实际数据是存储在LOCATION后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。当删除一个External Table时,仅删除该链接。
内部表和外部表是两个相对的概念,不可能有一个表同时既是内部表又是外部表
内部表与外部表的区别:删除表的时候是否删除hdfs上文件中的数据****
1)内部表数据由Hive自身管理,外部表数据由HDFS管理;
2)内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定;
3)删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
4)对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)
一般情况下存储公共数据的表要存放成外部表
3)分区表:不同于hadoop中分区,分区是人为划分的
hive最终存储海量数据,海量数据查询一定要避免全表扫描 select * from stu;
查询的时候为了提升查询性能,就出现了分区表
分区表是将数据按照用户的业务存储到不同的目录下
假设电信要查询不同地区的流量使用情况
北京 天津 上海 深圳
假设我就存在一个普通的表中,有一个字段是city 每次进行查询都需要进行全表扫描 性能不高
普通表存储路径:/hive/warehouse/log.txt
分区表:存储的指定的不同目录 就叫做分区字段 可以避免全表扫描
/hive/warehouse/city=beijing/log_beijing.txt /hive/warehouse/city=tianjin/log_tianjin.txt /hive/warehouse/city=shanghai/log_shanghai.txt /hive/warehouse/city=shenzhen/log_shenzhen.txt
数据查询 select * from stu where city=beijing;在执行的时候只会对指定的分区就行查询,不会全表扫描,可以提高查询效率
一般情况下生产中以日期作为分区字段
4)分桶表:类似于hadoop中的分区,分区是程序决定的 ,只能指定桶的个数,类似于hadoop中分区的个数
根据hash算法将余数不同的输出到不同的文件中
若指定三个分桶,则有三个文件
/hive/warehouse/part-r-0000 /hive/warehouse/part-r-0001 /hive/warehouse/part-r-0002
作用:
1)提升join的性能
2)提升数据样本的抽取效率 ,因为桶中的数据是比较散列的,可以直接拿一个桶中的数据作为样本数据
5)视图:
hive中的视图仅仅相当于一个sql语句的快捷方式/别名,而没有真正的执行sql语句,因为在hive中仅仅存在逻辑视图不存在物理视图
物理视图:是将sql语句的执行结果存储在视图中
stu:id name sex age department create view my_view as select id,name,sex,from stu; select * from my_view; --视图开始执行
三.hive数据存储:
hive 中的数据存储的时候原始数据存储在hdfs中,元数据存在mysql中
这期就先分享到这里,下期我会带大家一起详细讲解下hive中的DDL与DML语句,如果大家愿意一起学习,可以点击右上角关注哦!欢迎留下您的足迹与评论^^