原文:https://cwiki.apache.org/confluence/display/Hive/Design
Hive 架构
图左展现了Hive的组件及其与hadoop的接口。
- UI——用户接口。将用户查询或其他操作提交到系统。2011年以后拥有命令行接口及基于web的图形化接口。
- Driver——接收查询的组件。它实现了会话操作的概念,提供了可基于JDBC/ODBC接口执行及获取API的模型。
- Compiler——解析查询,在metastore的表和分区metadata的帮助下,对不同查询块、查询表达式进行语义分析,最终生成执行计划。
- Metastore——存储仓库中不同表及分区,包括列及列属性的全部的结构信息。串行器及解串行器需要读写数据及存储对应数据的HDFS文件。
- Execution Engine——执行Compiler产生的执行计划。执行计划是各阶段的有向无环图。执行引擎管理不同阶段的依赖,并在恰当的系统组件上执行前述阶段。
上图同时展现了一次查询的处理过程。UI调用了Driver的执行接口(step 1)。Driver创建了一个查询会话,并将查询发送给Compiler来生成执行计划(step 2)。Compiler从metastore中获取必要的元数据(steps 3和4)。元数据用来检查查询树中的表达式格式,并根据查询预期来削减分区。Compiler产生的执行计划(step 5)是map或reduce各种任务阶段的有向无环图,是一次元数据操作或者HDFS的操作。对map/reduce阶段来说,执行计划包含map的执行树(执行树在mappers上执行)以及reduce的执行树(需要reducers的操作)。执行引擎将各种状态提交给恰当的组件(steps 6, 6.1, 6.2 and 6.3)。每个任务中关联了表或中间输出的解串器被用于从HDFS中读取行,前述操作过程将通过相应的操作树。一旦产生了输出,结果会被串行器写入HDFS的临时文件(发生在不需要reduce的mapper中)。临时文件用于向随后的map/reduce执行计划阶段提供数据。DML操作的最终临时文件将被移动到表所在位置,保证脏数据不会被读取到。对于查询来讲,临时文件的内容是作为Driver获取命令的一部分,由执行引擎直接从HDFS读取的(steps 7、8和9)。
Hive 数据模型
Hive中的数据组织形式为:
- 表——与关系型数据库中的表类似。可以过滤、投影、连接和合并。此外,表中所有数据存储在HDFS中。Hive同时支持外部表的概念,一个表可以在一个已存在的HDFS文件或目录上创建,方式是向表格创建DDL提供对应的目录。表内行的组织形式为各数据类型的列,与关系型数据库类似。
- 分区——每个表可以拥有一到多个分区键,用来定义数据储存方式。例如:表T的数据分区ds用于存储日期,其数据文件在HDFS上存储目录为:<table location>/ds=<date>。分区使得系统可以通过查询预测减少检索的数据量。例如:一个针对T表中行的查询,如果符合T.ds = ‘2008-09-01’ 的预期,则仅需要查找 <table location>/ds=2008-09-01/ 目录下的文件。
- 桶——(你们大学计算机数据结构课程的内容终于用上了!)请参考桶排序与哈希表的相关知识。在Hive中,每个桶作为分区目录中的一个文件存储。桶使得系统可以依据数据例子迅速定位查询(有一些查询是使用表上的SAMPLE字句完成的)。
除了常见的列数据类型(整数、浮点数、字符串、日期和布尔值),Hive同时支持数组和图。此外,用户可以组合基本类型来自定义数据类型。类型系统与序列化及对象检查器接口(object inspector interfaces)紧密捆绑。用户可以通过实现对象检查器来创建类型,使用对象检查器可以实现对象在HDFS上的序列化。前述两个接口使得Hive具有了扩展能力,使得Hive可以理解其他数据格式及复杂类型。内建对象检查器为创建复杂类型提供了基础类型。图和数组格式内建了诸如大小、索引等功能。内嵌数据类型通过圆点查看,例如a.b.c = 1, 这个公式查看了a的b域内的c域,并与1进行比较。
METASTORE
动机
元数据存储提供了两个重要却常被忽视的数据仓库功能:数据抽象及数据发现。
数据抽象:如果没有Hive提供的数据抽象功能,用户需要在查询的时候同时提交数据格式、数据提取器及数据装载信息。在Hive中,前述数据在表创建时即给出,每次表被引用时都会重用。这与传统数据仓库很相似。
数据发现:使得用户可以发现及浏览数据仓库中的相关或者特定数据。可以使用元数据构建其他工具来对外提供数据,丰富数据信息,提高可用性等。
Hive通过提供元数据仓库实现了前述两大功能。元数据仓库服务与Hive查询进程紧密集成在一起,因此hive数据及其元数据是同步的。
Metadata Objects
- 数据库——表命名空间。未来可用作管理单元。非用户提供的表将放入default数据库。
- 表——一张表的元数据包括列的清单,所有人信息,存储信息,还包括序列化信息。还可以包含任何用户提供的键值、数据值。存储信息包含其下数据的存储路径、文件输入输出格式及桶信息。序列化信息包括串行器解串器的实现类,以及其他实现所需信息。所有信息都可以在建表时指定。
- 分区——每个分区可以拥有自己的列、序列化及存储信息。
Metastore Architecture
元数据存储是数据库或文件对象的存储仓库。数据库备份仓库采用……(这段翻译的性价比有点低,意会吧)
Hive Query Language
HiveQL是类SQL语言。创建表,表载入数据,表查询上与SQL语法类似。允许用户嵌入MapReduce脚本。兼容任何语言编写的,使用简单行数据流接口的脚本——从标准输入读入行,向标准输出写入行。另一个HiveQL独有的特性是多表插入(理解为将一份输入看成多个表,提供给多个查询请求,而且其扫描过程还是共享的:扫一次,提供给多个查询)。这个概念中,用户可以对一个输入使用一条HiveQL语句执行多种查询。Hive优化了查询,可以在多个查询中共享对输入数据的扫描,这将查询的吞吐能力提高了几个量级。其他内容见:https://cwiki.apache.org/confluence/display/Hive/LanguageManual。
Compiler
- 语法分析器——将查询字符串转化为语法分析树的表述。
- 语义分析器——将语法分析树转化为内部查询表述(依然基于块而不是执行树)。
- 逻辑计划发生器——将内部查询表述转化为逻辑计划,逻辑计划由执行器的树组成。
- 查询计划发生器——将逻辑计划转化为一系列的MapReduce任务。