什么是 Hive ?
- 一个基于 Hadoop 的数据仓库,适用于一些高延迟性的应用(离线开发),可以将存储在 Hadoop 文件中的结构化、半结构化数据文件映射为一张数据库表,并基于表提供类似 SQL 的查询模型,称为 Hive 查询语言(HQL),用于访问和分析存储在 Hadoop 文件中的大型数据集;
- Hive 的核心是将 HQL 转换为 MapReduce 程序,然后将程序提交到 Hadoop 集群执行;
- Hive 本身不存储和计算数据,它完全依赖于HDFS和MapReduce,Hive中的表是纯逻辑表;
什么是数据仓库?
- 数据仓库本身并不“生产“任何数据,其数据来源于不同外部系统;
- 同时数据仓库自身也不需要”消费“任何的数据,其结果开放给各个外部应用使用;
- 这就是为什么叫”仓库“,而不叫”工厂的原因“;
Hive 架构及组件
- Meta store:通常存储在关系型数据库如 Mysql / derby 中,Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否是外部表等),表的数据所在目录等;
- Driver:驱动程序,包括语法解析器、计划编译器、优化器、执行器。完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有执行引擎调用执行;
- 解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST ,对 AST 进行语法分析,比如 SQL 语义是否正确、表是否存在、字段是否存在;
- 编译器(Physical Plan):将 AST 编译生成逻辑执行计划(DAG);
- 优化器(Query Optimizer):对逻辑执行计划进行优化;
- 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划,就是 MapReduce / Spark 程序;
HQL 执行流程
- 发起请求: 从UI发起执行请求到Driver;
- 获取执行计划: Driver将用户请求发送到编译器获取执行计划;
- 获取元数据: 编译器根据 SQL 语句中相关表和分区信息从 Meta store 获取相关元数据;
- 返回元数据: Meta store 向编译器返回对应元数据;
- 返回执行计划: 根据表和分区的元数据对 SQL 解析和优化,生成逻辑执行计划。该计划是一个 DAG 图,每个 stage 对应一个 MapReduce 的 map 或者 reduce 操作;
- 运行执行计划: 将执行计划发送到 Execution Engine,执行引擎会将逻辑执行计划提交到 Hadoop 中以 MapReduce 形式进行执行;
- 运行结果获取: Driver将运行结果收集发送给UI;