hive学习笔记-架构分析

来源:互联网 发布:深圳八爪网络 编辑:程序博客网 时间:2024/06/06 17:13

一.什么是hive?

The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL. Structure can be projected onto data already in storage. A command line tool and JDBC driver are provided to connect users to Hive.

这是hive官网对hive的描述,翻译成中文如下:

Apache Hive™数据仓库软件可帮助读取,写入和管理使用SQL驻留在分布式存储中的大型数据集。结构可以投影到已经存储的数据上。提供了一个命令行工具和JDBC驱动程序,用于将用户连接到Hive。

也就是说hive是用来为操作分布式存储提供类sql操作

 

那么,hive是如何操作数据的

1.Hive是为了简化用户编写MapReduce程序而生成的一种框架,使用MapReduce做过数据分析的人都知道,很多分析程序除业务逻辑不同外,程序流程基本一样。在这种情况下,就需要Hive这样的用户编程接口。Hive提供了一套类SQL的查询语言,称为HQL,而在创造Hive框架的过程中之所以使用SQL实现Hive是因为大家对SQL语言非常的熟悉,转换成本低,可以大大普及我们Hadoop用户使用的范围,类似作用的Pig就不是通过SQL实现的。 
2.Hive是基于Hadoop的一个开源数据仓库系统,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,Hive可以把SQL中的表、字段转换为HDFS中的目录、文件。 

3.Hive是建立在Hadoop之上的数据仓库基础构架、是为了减少MapReduce编写工作的批处理系统,Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce。Hive可以理解为一个客户端工具,将我们的sql操作转换为相应的MapReduce jobs,然后在Hadoop上面运行。

4.Hive可以认为是MapReduce的一个封装、包装。Hive的意义就是在业务分析中将用户容易编写、会写的Sql语言转换为复杂难写的MapReduce程序,从而大大降低了Hadoop学习的门槛,让更多的用户可以利用Hadoop进行数据挖掘分析。  

这样我们就知道,hive就是把一个mapreduce程序封装成类sql语句(hql)


那么,hive是如何把sql语句解析成一个mapreduce程序


hive是通过编译器来解释hql语句,编译器的结构图如下:




编译器的执行流程如下:


整个过程分为六个阶段:

  1. Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree
  2. 遍历AST Tree,抽象出查询的基本组成单元QueryBlock
  3. 遍历QueryBlock,翻译为执行操作树OperatorTree
  4. 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量
  5. 遍历OperatorTree,翻译为MapReduce任务
  6. 物理层优化器进行MapReduce任务的变换,生成最终的执行计划

二.hive的体系架构

我们先来看一下hive的体系架构图:

从图中我们可以看出Hive的体系结构可以分为以下几个部分: 
1.用户接口:包括shell命令、Jdbc/Odbc和WebUi,其中最常用的是shell这个客户端方式对Hive进行相应操作 

2.Hive解析器(驱动Driver):Hive解析器的核心功能就是根据用户编写的Sql语法匹配出相应的MapReduce模板,形成对应的MapReduce job进行执行。 

3.Hive元数据库(MetaStore):Hive将表中的元数据信息存储在数据库中,如derby(自带的)、Mysql(实际工作中配置的),Hive中的元数据信息包括表的名字、表的列和分区、表的属性(是否为外部表等)、表的数据所在的目录等。Hive中的解析器在运行的时候会读取元数据库MetaStore中的相关信息。 
( ps:在实际业务当中不用Hive自带的数据库derby,而要重新为其配置一个新的数据库Mysql,是因为derby这个数据库具有很大的局限性:derby这个数据库不允许用户打开多个客户端对其进行共享操作,只能有一个客户端打开对其进行操作,即同一时刻只能有一个用户使用它,自然这在工作当中是很不方便的,所以我们要重新为其配置一个数据库。)

4.Hadoop:Hive用HDFS进行存储,用MapReduce进行计算——-Hive这个数据仓库的数据存储在HDFS中,业务实际分析计算是利用MapReduce执行的。 

三.hive的运行机制

先上一张hive的运行机制图:





从图中我们可以看出,hive运行的大概步骤是:
1. 用户提交查询的hql语句给Driver。
2. 编译器获取用户的任务的Plan。
3. 编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。
4. 编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划(MapReduce), 最后选择最佳的策略。
5. 将最终的计划提交给Driver。
6. Driver将计划Plan转交给ExecutionEngine去执行,获取元数据信息,提交给JobTracker或者SourceManager执行该任务,任务会直接读取HDFS中文件进行相应的操作。
7. 获取执行的结果。
8. 取得并返回执行结果。

三.hive的数据类型

数字类型

  • TINYINT(1字节有符号整数,从-128127
  • SMALLINT(2字节有符号整数,从-32,76832,767
  • INT / INTEGER(4字节有符号整数,从-2,147,483,648到2,147,483,647)
  • BIGINT(8字节有符号整数,从-9,223,372,036,854,775,8089,223,372,036,854,775,807
  • FLOAT (4字节单精度浮点数)
  • DOUBLE (8位双精度浮点数)
  • DOUBLE PRECISION  ( DOUBLE的别名,仅供 Hive 2.2.0开始使用
  • DECIMAL
    • 在Hive 0.11.0中引入了38位精度
    • Hive 0.13.0引入了用户定义的精度和尺度
  • NUMERIC(相同DECIMAL,从Hive 3.0.0开始

日期/时间类型

  • TIMESTAMP(注:只有从Hive 0.8.0开始
  • DATE(注:只有从Hive 0.12.0开始
  • INTERVAL(注:只有从Hive 1.2.0开始

字符串类型

  • STRING
  • VARCHAR(注:只有从Hive 0.12.0开始
  • CHAR(注:只有从Hive 0.13.0开始

杂项类型

  • BOOLEAN
  • BINARY(注:只有从Hive 0.8.0开始

复杂类型

  • 数组:(ARRAY<data_type>注意:负数值和非常数表达式允许为  Hive 0.14。)
  • 地图:( MAP<primitive_type, data_type>注意:负数值和非常数表达式允许为  Hive 0.14。)
  • 结构: STRUCT<col_name : data_type [COMMENT col_comment], ...>
  • 联合:(UNIONTYPE<data_type, data_type, ...>注:只有从Hive 0.7.0开始。)

列类型

积分类型(TINYINT,  SMALLINT,  INT/INTEGER,  BIGINT

假定整数文字是INT默认值,除非该数字超出了INT这种情况,将其解释为BIGINT的范围,或者数字中存在以下后缀之一。


Type

Postfix

Example

TINYINT

Y

100Y

SMALLINT

S

100S

BIGINT

L

100L