Hive 最初是由 FaceBook 公司开发的一个基于 Hadoop 框架并且开源的一个数据仓库工具,后贡献给了 Apache 基金会由 Apache 来进行维护和更新。Hive 可以将结构化的文件映射为一张数据表,但并不提供查询功能,而是将 HiveQL 转化为 MapReduce 任务进行运行。同时,Hive 本身不存储数据,只是存储数据的路径或者操作信息,真的数据是存储在可靠的文件系统当中(如HDFS、Derby等)。

0x00 Hive 架构

Hive 架构

Hive 架构主要包括如下组件:CLI(command line interface)、JDBC/ODBC、Web GUI(Hive WEB Interface)、Thrift Server、Metastore 和 Driver(Complier、Optimizer 和 Executor),这些组件可以分为两大类:服务端组件和客户端组件。

(1) 客户端组件

  • CLI:最常用的用户接口,cli 启动的时候,会同时启动一个 Hive 副本;
  • JDBC/ODBC:Client 是 Hive 的客户端,用户连接至 Hive Server。在启动 Client 模式的时候,需要指出 Hive Server 所在节点,并且在该节点启动 Hive Server ;
  • HWI:通过浏览器访问 Hive;

(2) 服务端组件

  • Thrift Server:Thrift 是 facebook 开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,hive 集成了Thrift Server 服务,能让不同的编程语言调用 hive 的接口;
  • Metastore:元数据服务组件,这个组件用于存储 hive 的元数据,包括表名、表所属的数据库、表的拥有者、列/分区字段、表的类型、表的数据所在目录等内容。hive 的元数据存储在关系数据库里,支持 derby、mysql 两种关系型数据库;
  • Driver:包括 Complier、Optimizer 和 Executor,它们的作用是将我们写的 HiveQL 语句进行解析、编译、优化,生成执行计划,然后调用底层的 MapReduce 计算框架;

0x01 Hive 工作原理

Hive 查询的工作流程

  1. UI 提交查询(HiveQL)给 Driver;
  2. Driver 为查询创建会话句柄,并将查询发给 Complier 生成执行计划;
  3. Complier 从 Metastore 获取必要的元数据信息;
  4. 由 Complier 生成的执行计划是 作业的DAG,包括三种作业:MapReduce 作业、元数据操作、HDFS 操作;
  5. Execution Engine 将不同作业提交给对应的组件;
  6. Execution Engine 将匹配上的查询结果经过 Driver 发送给 UI。

细心的读者会发现,上述执行过程还是 JobTracker 版本,从 Hadoop-2.x 开始升级为 YARN,MapReduce 作为一种应用程序运行在 YARN 框架下。

0x02 Hive 特点

(1) 优点

  • 简单容易上手:提供了类 SQL 查询语言 HiveQL
  • 可扩展:为超大数据集设计了计算/扩展能力(MR 作为计算引擎,HDFS 作为存储系统)
  • 提供统一的元数据管理
  • 延展性:Hive 支持用户自定义函数,还允许 TRANSFORM 嵌入不同语言的 map-reduce 脚本
  • 容错:良好的容错性,节点出现问题 SQL 仍可完成执行

(2) 缺点

  • HiveQL 表达能力有限(迭代式算法,数据挖掘)
  • hive 效率比较低(mapreduce,调优)
  • hive 可控性差

参考文献

Hive Architecture Overview
深入学习Hive应用场景及架构原理
Hive的架构及元数据三种存储模式