Hive 功能特性和组件原理
1、什么是Hive
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hive不是:
- 关系数据库
- OnLine事务处理(OLTP)的设计
- 用于实时查询和行级更新的语言
Hive的特点:
- 为OLAP设计的。
- 提供用于查询的SQL类型语言,称为HiveQL或HQL。
- 通过Apache Tez,Apache Spark或MapReduce执行查询。
- Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
- Hive支持用户自定义函数,有良好的延展性,用户可以根据自己的需求来实现自己的函数。
- 良好的容错性,节点出现问题SQL仍可完成执行。
Hive与传统数据库对比
HIve | RDBMS | |
---|---|---|
查询语句 | HQL | SQL |
数据库存储 | HDFS | Raw Device or Local FS |
执行 | MapReduce/Tez/Spark | Excutor |
执行延迟 | 高 | 低 |
处理数据规模 | 大 | 小 |
索引 | 0.8版本后加入位图索引 | 有复杂的索引 |
hive具有sql数据库的外表,但应用场景完全不同,hive只适合用来做批量数据统计分析。
2、Hive体系结构
以下组件图描述了Hive的体系结构:
该组件图包含不同的单位。下表描述了每个单元:
单元名称 | 操作 |
---|---|
用户界面 | Hive是一个数据仓库基础设施软件,可以创建用户和HDFS之间的交互。Hive支持的用户界面是Hive Web UI,Hive命令行和Hive HD Insight(在Windows服务器中)。 |
Meta Store | Hive选择相应的数据库服务器来存储表,数据库,列的架构或元数据,表格,数据类型和HDFS映射。 |
HiveQL流程引擎 | HiveQL与用于查询Metastore上的模式信息的SQL类似。它是MapReduce程序的传统方法的替代之一。我们可以编写MapReduce作业查询并处理它,而不用Java编写MapReduce程序。 |
执行引擎 | HiveQL进程引擎和MapReduce的结合部分是Hive执行引擎。执行引擎处理查询并生成与MapReduce结果相同的结果。它使用MapReduce的风格。 |
HDFS或HBASE | Hadoop分布式文件系统或HBASE是将数据存储到文件系统的数据存储技术。 |
3、Hive工作流程
下图描述了Hive和Hadoop之间的工作流程:
步骤号 | 操作 |
---|---|
1 | **执行查询** Hive接口(如命令行或Web UI)向Driver(任何数据库驱动程序,如JDBC,ODBC等)发送查询以执行。 |
2 | **获取计划** 驱动程序在查询编译器的帮助下解析查询以检查语法和查询计划或查询的要求。 |
3 | **获取元数据** 编译器将元数据请求发送到Metastore(任何数据库)。 |
4 | **发送元数据** Metastore将元数据作为响应发送给编译器。 |
5 | **发送计划**编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划(MapReduce/TEZ), 最后选择最佳的策略。 将计划重新发送给驱动程序。到此为止,查询的解析和编译已完成。 |
6 | **执行计划** 驱动程序将执行计划发送给执行引擎。 |
7 | **执行作业** 在内部,执行作业的过程是一个MapReduce作业。执行引擎将作业发送到名称节点中的JobTracker,并将该作业分配给数据节点中的TaskTracker。在这里,查询执行MapReduce作业。 |
7.1 | **元数据操作** 同时在执行时,执行引擎可以使用Metastore执行元数据操作。 |
8 | **取结果** 执行引擎从Data节点接收结果。 |
9 | **发送结果** 执行引擎将这些结果值发送给驱动程序。 |
10 | **发送结果** 驱动程序将结果发送给Hive Interfaces。 |
4、数据类型
分类 | 类型 | 描述 | 字面量示例 |
---|---|---|---|
|
BOOLEAN | true/false | TRUE |
TINYINT | 1字节的有符号整数 -128~127 | 1Y | |
SMALLINT | 2个字节的有符号整数,-32768~32767 | 1S | |
INT | 4个字节的带符号整数 | 1 | |
BIGINT | 8字节带符号整数 | 1L | |
FLOAT | 4字节单精度浮点数 | 1.0 | |
DOUBLE | 8字节双精度浮点数 | 1.0 | |
STRING | 字符串,变长 | “a”,’b’ | |
BINARY | 字节数组 | 无法表示 | |
TIMESTAMP | 时间戳,纳秒精度 | 122327493795 | |
DATE | 日期 | ‘2016-03-29’ |
复杂类型 |
ARRAY | 有序的的同类型的集合 | array(1,2) |
MAP | key-value,key必须为原始类型,value可以任意类型 | map(‘a’,1,’b’,2) | |
STRUCT | 字段集合,类型可以不同 | struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0) |