数据仓库工具之Hive的架构原理

1. Hive的本质

Hive是基于Hadoop的一个数据仓库工具,它的本质是将HQL语句转化成MapReduce程序.在它的底层,HDFS负责存储数据,YARN负责进行资源管理,MapReduce负责数据处理.

2.Hive架构

image.png
架构组成:
(1) 用户接口(Client):

ClientCLI(hive shell)、JDBC/ODBC(java访问hive),WEBUI(浏览器访问hive)

(2) 元数据(Metastore):

Metastore元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;默认存储在自带的derby数据库中,推荐使用采用关系型数据库MySQL存储Metastore;

(3) 驱动器(Driver)包含:解析器、编译器、优化器、执行器;
  • 解析器:将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误(比如select中被判定为聚合的字段在group by中是否有出现);
  • 编译器:将抽象语法树AST编译生成逻辑执行计划;
  • 优化器:对逻辑执行计划进行优化;
  • 执行器:把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/TEZ/Spark.
(4) Hive使用HDFS存储数据.

Hive本身不存在数据,Hive虽有表的定义但表是纯的逻辑表,数据是存在HDFS上的.HIVE中的内容不支持改写和删除,适合读多写少的场景.

3.Hive执行流程

如上图所示,我们通过Hive提供的一系列交互接口(Client),向Hive提交SQL指令(HSQL).如果我们提交的是创建表的DDL语句(数据定义语言),Hive会通过使用自己的执行引擎(Driver)将数据表的信息记录在Metastore元数据组件中,正如上面提到的,元数据组件通常用一个关系型数据库实现,其记录着表名,字段名,字段类型以及关联的HDFS文件路径等元信息.

如果我们提交的是DQL语句(数据查询分析语句),Hive的执行引擎(Drive)会结合元数据信息对该语句进行转换,语法分析,语法优化等操作,最后生成一个MapReduce执行计划.

说具体一点,就是Hive执行引擎(Drive)会将该语句提交给自己的解析器(SQL Parser),解析器接收到语句之后,会将SQL查询字符串转换成抽象语法树,并对抽象语法树进行语法分析,比如检测表是否存在,字段是否存在,SQL语义是否有误等,之后将经过语法分析后的抽象语法树提交给编译器.

编译器再将抽象语法树编程成逻辑执行计划(Physical Plan),然后再由优化器(Query Optimizer)对逻辑执行计划进行优化,最后由执行器(Execution)将逻辑执行计划转换成可以运行的物理计划,也即是MapReduce执行计划,然后再根据执行计划生成一个MapReduce的作业,提交到Yarn上执行,最后,将执行返回的结果输出到用户交互接口.

Hive内部预置了很多函数,Hive的执行计划就是根据用户提交的HQL语句生成这些函数的DAG(有向无环图),然后封装进MapReduce的map和reduce函数中.

你可能感兴趣的:(数据仓库工具之Hive的架构原理)