【转】Hive 工做原理详解

什么是Hive?

       Hive是创建在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,能够用来进行数据提取转化加载(ETL),这是一种能够存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它容许熟悉 SQL 的用户查询数据。同时,这个语言也容许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 没法完成的复杂的分析工做。java

 

Hive 构建在基于静态批处理的Hadoop 之上,Hadoop 一般都有较高的延迟而且在做业提交和调度的时候须要大量的开销。所以,Hive 并不可以在大规模数据集上实现低延迟快速的查询,例如,Hive 在几百MB 的数据集上执行查询通常有分钟级的时间延迟。sql

Hive 并不适合那些须要低延迟的应用,例如,联机事务处理(OLTP)。Hive 查询操做过程严格遵照Hadoop MapReduce 的做业执行模型,Hive 将用户的HiveQL 语句经过解释器转换为MapReduce 做业提交到Hadoop 集群上,Hadoop 监控做业执行过程,而后返回做业执行结果给用户。Hive 并不是为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操做。Hive 的最佳使用场合是大数据集的批处理做业,例如,网络日志分析。数据库

Hive与Hadoop

       Hive的执行入口是Driver,执行的SQL语句首先提交到Drive驱动,而后调用compiler解释驱动,最终解释成MapReduce任务去执行。浏览器

Hive的服务端组件

1. Driver组件:该组件包括:Compiler、Optimizer、Executor,它能够将Hive的编译、解析、优化转化为MapReduce任务提交给Hadoop1中的JobTracker或者是Hadoop2中的SourceManager来进行实际的执行相应的任务。网络

 

2. MetaStore组件:存储着hive的元数据信息,将本身的元数据存储到了关系型数据库当中,支持的数据库主要有:Mysql、Derby、支持把metastore独立出来放在远程的集群上面,使得hive更加健壮。元数据主要包括了表的名称、表的列、分区和属性、表的属性(是否是外部表等等)、表的数据所在的目录。app

 

3. 用户接口:CLI(Command Line Interface)(经常使用的接口:命令行模式)、Client:Hive的客户端用户链接至Hive Server ,在启动Client的时候,须要制定Hive Server所在的节点,而且在该节点上启动Hive Server、WUI:经过浏览器的方式访问Hive。工具

Hive的工做原理

如图:oop

流程大体步骤为:大数据

1. 用户提交查询等任务给Driver。优化

2. 编译器得到该用户的任务Plan。

3. 编译器Compiler根据用户任务去MetaStore中获取须要的Hive的元数据信息。

4. 编译器Compiler获得元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,而后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划(MapReduce), 最后选择最佳的策略。

5. 将最终的计划提交给Driver。

6. Driver将计划Plan转交给ExecutionEngine去执行,获取元数据信息,提交给JobTracker或者SourceManager执行该任务,任务会直接读取HDFS中文件进行相应的操做。

7. 获取执行的结果。

8. 取得并返回执行结果。

 

建立表时:

解析用户提交的Hive语句-->对其进行解析-->分解为表、字段、分区等Hive对象。根据解析到的信息构建对应的表、字段、分区等对象,从SEQUENCE_TABLE中获取构建对象的最新的ID,与构建对象信息(名称、类型等等)一同经过DAO方法写入元数据库的表中,成功后将SEQUENCE_TABLE中对应的最新ID+5.实际上常见的RDBMS都是经过这种方法进行组织的,其系统表中和Hive元数据同样显示了这些ID信息。经过这些元数据能够很容易的读取到数据。

Hive编译过程

基本流程为:将HiveQL转化为抽象语法树再转为查询块而后转为逻辑查询计划再转为物理查询计划最终选择最佳决策的过程。

 

优化器的主要功能:

1. 将多Multiple join 合并为一个Muti-way join

2. 对join、group-by和自定义的MapReduce操做从新进行划分。

3. 消减没必要要的列。

4. 在表的扫描操做中推行使用断言。

5. 对于已分区的表,消减没必要要的分区。

6. 在抽样查询中,消减没必要要的桶。

7. 优化器还增长了局部聚合操做用于处理大分组聚合和增长再分区操做用于处理不对称的分组聚合。

Hive的数据类型

Hive支持原子和复杂数据类型,原子数据类型包括:数据值、布尔类型、字符串类型等,复杂的类型包括:Array、Map和Struct。其中Array和Map和java中的Array和Map是类似的,Struct和C语言中的Struct类似。

例如:

[sql] view plain copy

  1. Create table test(  

  2. col1 Array<int>,  

  3. col2 Map<String,int>,  

  4. col3 Struct<a:String,b:int,c:Double>  

  5. );  

注意:

1. 原子数据类型是能够进行隐式的转换的,例如tinyInt类型会自动转为Int类型可是不能由int自动转为tinyInt类型。

2. 全部的整数类型、Float和String类型均可以转换为Double类型。

3. TinyInt、SmallInt、Int均可以转为Float类型。

4. Boolean 类型不能够转换为其余的任何类型。

5. 能够经过使用Cast操做显示的进行数据转换,例如Cast('1' as int);将字符串转为整型,若是强制转换失败如:Cast('X' as int);表达式返回的是NULL;

Hive的特色

相关文章
相关标签/搜索