认识 Hive

Hive 是基于 Hadoop 构建的一套数据仓库分析系统,它提供了丰富的 SQL 查询方式来分析存储在 Hadoop 分布式文件系统中的数据, 可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,可以将 SQL 语句转换为 MapReduce 任务进行运行,通过自己的 SQL 去 查询分析需要的内容,这套 SQL 简称 Hive SQL,使不熟悉 MapReduce 的用户很方便地利用 SQL 语言查询、汇总、分析。

Hive 工作原理

   Hive 工作原理如下图所示。

hive 执行sql 脚本的sql hive执行sql原理_hive 执行sql 脚本的sql

MapReduce 开发人员可以把自己写的 Mapper 和 Reducer 作为插件支持 Hive 做更复杂的数据分析。 它与关系型数据库的 SQL 略有不同,但支持了绝大多数的语句(如 DDL、DML)以及常见的聚合函数、连接查询、条件查询等操作。

 Hive 不适合用于联机(online) 事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。Hive 的特点是可 伸缩(在Hadoop 的集群上动态的添加设备),可扩展、容错、输入格式的松散耦合。Hive 的入口是DRIVER ,执行的SQL 语句首先提交到 DRIVER 驱动,然后调用COMPILER 解释驱动, 最终解释成 MapReduce 任务执行,最后将结果返回。

Hive 数据类型

 Hive 提供了基本数据类型和复杂数据类型,复杂数据类型是 Java 语言所不具有的。本课程介绍 Hive 的两种数据类型以及数据类型之间的转换。

 基本数据类型

hive 执行sql 脚本的sql hive执行sql原理_Hadoop_02

 由上表我们看到hive不支持日期类型,在hive里日期都是用字符串来表示的,而常用的日期格式转化操作则是通过自定义函数进行操作。

hive是用java开发的,hive里的基本数据类型和java的基本数据类型也是一一对应的,除了 string类型。有符号的整数类型:TINYINT、SMALLINT、INT和BIGINT分别等价于java的byte、short、int和 long原子类型,它们分别为1字节、2字节、4字节和8字节有符号整数。Hive的浮点数据类型FLOAT和DOUBLE,对应于java的基本类型float和double类型。而hive的BOOLEAN类型相当于java的基本数据类型boolean。

 对于hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。

 复杂数据类型

hive 执行sql 脚本的sql hive执行sql原理_大讲台内测员_03

Hive 有三种复杂数据类型 ARRAY、MAP和 STRUCT。ARRAY 和 MAP 与 Java 中的 Array和 Map 类似,而STRUCT 与 C语言中的 Struct 类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。

Hive 安装

 Hive 安装依赖 Hadoop 的集群,它是运行在 Hadoop 的基础上。 所以在安装 Hive 之前,保证 Hadoop 集群能够成功运行。

Hive 架构

Hive 架构可以分为四部分。

hive 执行sql 脚本的sql hive执行sql原理_大数据_04

用户接口

Hive 对外提供了三种服务模式,即 Hive 命令行模式(CLI),Hive 的 Web 模式(WUI),Hive 的远程服务(Client)。下面介绍这些服务的用法。

 1、 Hive 命令行模式

 Hive 命令行模式启动有两种方式。执行这条命令的前提是要配置 Hive 的环境变量。

2、Hive Web 模式

元数据存储

Hive 将元数据存储在 RDBMS 中,一般常用 MySQL 和 Derby。默认情况下,Hive 元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的测试。实际生产环境中不适用,为了支持多用户会话,则需要一个独立的元数据库,使用 MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持

解释器、编译器、优化器

Driver 调用解释器(Compiler)处理HiveQL 字串,这些字串可能是一条 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)查询中,消减不必要的桶。

 此外,优化器还能增加局部聚合操作用于处理大分组聚合(groupedaggregations)和 增加再分区操作用于处理不对称(skew)的分组聚合。