hive体系结构mysql
Hive体系结构图:主要分为:用户接口、Thrift服务器、元数据存储、解析器、Hadoopsql
Hive 对外提供了三种服务模式,即 Hive 命令行模式(CLI),Hive 的 Web 模式(WUI),Hive 的远程服务(Client)。数据库
Hive 将元数据存储在数据库中(metastore),目前只支持mysql、derby。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。服务器
解释器、编译器、优化器。
Driver 调用解释器(Compiler)处理 HiveSQL 字串,这些字串多是一条 DDL、DML或查询语句。编译器将字符串转化为策略(plan)。策略仅由元数据操做 和 HDFS 操做组成,元数据操做只包含 DDL 语句,HDFS 操做只包含 LOAD 语句。对插入和查询而言,策略由 MapReduce 任务中的具备方向的非循环图(directedacyclic graph,DAG)组成,具体流程以下。
1)解析器(parser):将查询字符串转化为解析树表达式。
2)语义分析器(semantic analyzer):将解析树表达式转换为基于块(block-based)的内部查询表达式,将输入表的模式(schema)信息从 metastore 中进行恢复。用这些信息验证列名, 展开 SELECT * 以及类型检查(固定类型转换也包含在此检查中)。
3)逻辑策略生成器(logical plan generator):将内部查询表达式转换为逻辑策略,这些策略由逻辑操做树组成。
4)优化器(optimizer):经过逻辑策略构造多途径并以不一样方式重写。优化器的功能以下。
将多 multiple join 合并为一个 multi-way join;
对join、group-by 和自定义的 map-reduce 操做从新进行划分;
消减没必要要的列;
在表扫描操做中推行使用断言(predicate);
对于已分区的表,消减没必要要的分区;
在抽样(sampling)查询中,消减没必要要的桶。
此外,优化器还能增长局部聚合操做用于处理大分组聚合(grouped aggregations)和 增长再分区操做用于处理不对称(skew)的分组聚合。数据结构
Hive常见操做符oop
Hive数据结构优化
Hive的存储是创建在Hadoop文件系统之上的,它自己没有专门的数据存储格式,其主要包括四类数据模型:
表(Table)
分区(Partition)
桶(Bucket)
外部表(External Table)命令行
内部表xml
与数据库中的 Table 在概念上是相似
每个 Table 在 Hive 中都有一个相应的目录存储数据。例如,一个表test,它在 HDFS 中的路径为:/ warehouse/test。 warehouse是在hive-site.xml 中由 ${hive.metastore.warehouse.dir}
指定的数据仓库的目录
全部的 Table 数据(不包括 External Table)都保存在这个目录中。
删除表时,元数据与数据都会被删除索引
外部表
指向已经在 HDFS 中存在的数据,能够建立 Partition
它和 内部表 在元数据的组织上是相同的,而实际数据的存储则有较大的差别
内部表 的建立过程和数据加载过程(这两个过程能够在同一个语句中完成),在加载数据的过程当中,实际数据会被移动到数据
仓库目录中;以后对数据对访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除
外部表只有一个过程,加载数据和建立表同时完成,并不会移动到数据仓库目录中,只是与外部数据创建一个连接。当删除一个外部表时,仅删除连接
分区表
Partition 对应于数据库的 Partition 列的密集索引
在 Hive 中,表中的一个 Partition 对应于表下的一个目录,全部的 Partition 的数据都存储在对应的目录中
例如:test表中包含 date 和 city 两个 Partition,
则对应于date=20130201, city = bj 的HDFS 子目录:
/warehouse/test/date=20130201/city=bj
对应于date=20130202, city=sh 的HDFS 子目录为;
/warehouse/test/date=20130202/city=sh
桶表
桶表是对数据进行哈希取值,而后放到不一样文件中存储。
建立表create table bucket_table(id string) clustered by(id) into 4 buckets; 加载数据set hive.enforce.bucketing = true;
insert into table bucket_table select name from stu;
insert overwrite table bucket_table select name from stu;
数据加载到桶表时,会对字段取hash值,而后与桶的数量取模。把数据放到对应的文件中。
Hive工做原理