多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
<mark>Hive 底层存储是基于 HDFS 进行存储,Hive 的计算底层是转换成 MapReduce 程序进行计算</mark>。 :-: ![](https://img.kancloud.cn/29/17/291738fcfcd046519383bf9e7ec94e0f_1009x444.png) hive 架构图参考 <br/> 如图中所示,Hive 通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的 Driver,结合元数据 (MetaStore),将这些指令翻译成MapReduce,提交到 Hadoop 中执行,最后,将执行返回的结果输出到用户交互接口。 <br/> **1. 用户接口:Client** CLI(Hive Shell)、JDBC/ODBC(Java 访问 Hive)、WEBUI(浏览器访问 Hive)。 <br/> (1)CLI:命令行接口,是最常用的一种用户接口,CLI 启动时会同时启动一个 Hive 副本。CLI 是和 Hive 交互的最简单也是最常用方式,只需要在一个具备完整 Hive环境下的 Shell 终端中键入 hive 即可启动服务。<ins>用户可以在 CLI 上输入 HQL 来执行创建表、更改属性以及查询等操作。不过 Hive CLI 不适应于高并发的生产环境,仅仅是 Hive 管理员的好工具(开发测试常用)</ins>。 <br/> (2)JDBC/ODBC: JDBC 是 java database connection 的规范,它定义了一系列 java 访问各类 db 的访问接口,因此 hive-jdbc 其实本质上是扮演一个协议转换的角色,把 jdbc 的标准协议转换为访问 HiveServer 服务的协议。hive-jdbc 除了扮演网络协议转化的工作,并不承担他的工作,比如 sql 的合法性校验和解析,一律忽略 。 <br/> ODBC 是一组对数据库访问的标准 API,它的底层实现源码是采用 C/C++编写的。 JDBC/ODBC 都是通过 hiveclient 与 hiveserver 保持通讯的,借助 thrfit rpc 协议来实现交互。 <br/> (3)HWI:HWI 是 Hive 的 web 方为接口,提供了一种可以可以通过浏览器来访问 Hive 的服务(开发测试常用)。 <br/> **2. 服务端组件** (1)Thrift Server Thrift 是 facebook 开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,hive 集成了 Thrift Server 服务,能让不同的编程语言调用 hive 的接口。 <br/> (2)元数据(Metastore) 元数据服务组件,这个组件用于存储 hive 的元数据,包括表名、表所属的数据库、表的拥有者、列/分区字段、表的类型、表的数据所在目录等内容。 <br/> <ins>hive 的元数据存储在关系数据库里,支持 derby、mysql 两种关系型数据库。</ins>元数据对于 hive 十分重要,因此 hive 支持把 metastore 服务独立出来,安装到远程的服务器集群里,从而解耦 hive 服务和 metastore 服务,保证 hive 运行的健壮性。 <br/> (3)Driver 组件 该组件包括 Interpreter、Complier、Optimizer 和 Executor,它的作用是将我们写的 HiveQL(类 SQL)语句进行解析、编译、优化,生成执行计划,然后调用底层的 mapreduce 计算框架。 * 解析器(SQL Parser):<mark>将 SQL 字符串转换成抽象语法树 AST</mark>,这一步一般都用第三方工具库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、SQL 语义是否有误。 * 编译器(Physical Plan):<mark>将 AST 编译生成逻辑执行计划</mark>。 * 优化器(Query Optimizer):<mark>对逻辑执行计划进行优化</mark>。 * 执行器(Execution):<mark>把逻辑执行计划转换成可以运行的物理计划</mark>。对于 Hive 来说,一般常用的为 MR/TEZ/Spark。 <br/> **3. Hadoop** Hive 底层是使用 HDFS 进行存储,默认使用 MapReduce 进行计算。