1 Hive 概念
关于Hive,我们首先需要了解如下几个概念:
1、由FaceBook实现并开源;
2、基于Hadoop的开源数据仓库工具,用于存储结构化的数据;
3、可以将结构化的数据映射为一张数据库表;
4、底层数据存储在HDFS文件系统上,描述数据的数据(元数据)存储在derby或者是远程数据库中,如:mysql;
5、提供一套类数据库的处理机制,HQL查询功能;
6、本质是将SQL语句转换为MapReduce任务运行;
7、使不熟悉MapReduce的用户很方便的利用HQL处理和计算HDFS上的结构化数据,适用于离线批量数据计算。
Hive是一种建立在Hadoop文件系统上的数据仓库架构,并对存储在HDFS中的数据进行分析和管理;它可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,可以将 SQL 语句转换为 MapReduce 任务进行运行,通过自己的 SQL 去查询分析需要的内容,这套 SQL 简称 Hive SQL(HQL),使不熟悉 MapReduce 的用户也能很方便地利用 SQL 语言对数据进行查询、汇总、分析。同时,这个语言也允许熟悉 MapReduce 开发者们开发自定义的mappers和reducers来处理内建的mappers和reducers无法完成的复杂的分析工作。Hive还允许用户编写自己定义的函数UDF,用来在查询中使用。
Hive中有3种UDF:User Defined Functions(UDF)、User Defined Aggregation Functions(UDAF)、User Defined Table Generating Functions(UDTF)。也就是说对存储在HDFS中的数据进行分析和管理,我们不想使用手工,那就使用Hive。
1.1 Hive常见的应用场景
(1)日志分析:大部分互联网公司使用hive进行日志分析,包括百度、淘宝等。
1)统计网站一个时间段内的pv、uv
2)多维度数据分析
(2)海量结构化数据离线分析
1.2 Hive的特点
1.2.1 hive的优点
(1)简单容易上手:提供了类SQL查询语言HQL
(2)可扩展:为超大数据集设计了计算/扩展能力(MR作为计算引擎,HDFS作为存储系统),一般情况下不需要重启服务Hive可以自由的扩展集群的规模。
(3)提供统一的元数据管理
(4)延展性:Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数
(5)容错:良好的容错性,节点出现问题SQL仍可完成执行
1.2.2 Hive的缺点
- 不支持记录级别的更新、插入和删除操作:
Hive不是一个完整的数据库。Hadoop以及hdfs的设计本身约束和局限性地限制了hive所能胜任的工作。Hive不支持记录级别的更新、插入和删除操作。但是用户可以通过查询生成新表或者将查询结果导入到文件中。 - 查询延时比较严重:
因为Hadoop是一个面向批处理的系统,而mapreduce任务(job)的启动过程需要消耗较长的时间,所以hive查询延时比较严重。传统数据库中在秒级可以完成的查询,在hive中,即时数据集相对较小,往往也需要执行更长的时间。由于Hadoop本身的时间开销很大,并且Hadoop所被设计用来处理的数据规模非常大,因此提交查询和返回结果是可能具有非常大的延时的,所以hive并不能满足OLAP的“联机”部分,至少目前并没有满足。如果用户需要对大规模数据使用OLTP功能的话,那么应该选择使用一个NOSQL数据库。例如,和Hadoop结合使用的HBase及Cassandra. - 不支持事务:
因为不没有增删改,所以主要用来做 OLAP(联机分析处理),而不是 OLTP(联机事务处理),这就是数据处理的两大级别。
2 Hive 架构
基本组成
1、 用户接口
CLI,Shell 终端命令行(Command Line Interface),采用交互形式使用 Hive 命令行与 Hive进行交互,最常用(学习,调试,生产)JDBC/ODBC,是 Hive 的基于 JDBC 操作提供的客户端,用户(开发员,运维人员)通过这连接至 Hive server 服务Web UI,通过浏览器访问 Hive。
2、Thrift Server
Thrift 是 Facebook 开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发,Hive 集成了该服务,能让不同的编程语言调用 Hive 的接口。
3、 元数据存储
元数据,通俗的讲,就是存储在 Hive 中的数据的描述信息。Hive 中的元数据通常包括:表的名字,表的列和分区及其属性,表的属性(内部表和外部表),表的数据所在目录Metastore 默认存在自带的 Derby 数据库中。这种方式的缺点就是不适合多用户操作,并且数据存储目录不固定。数据库跟着 Hive 走,极度不方便管理。
所以一般都是存储到独立的MySQL库(本地或远程), Hive 和 MySQL 之间通过MetaStore 服务交互。
Hive将元数据存储在RDBMS中,有三种模式可以连接到数据库:
1) 单用户模式。此模式连接到一个In-memory 的数据库Derby,一般用于Unit Test。
2) 多用户模式。通过网络连接到一个数据库中,是最经常使用到的模式。
3) 远程服务器模式。用于非Java客户端访问元数据库,在服务器端启动MetaStoreServer,客户端利用Thrift协议通过MetaStoreServer访问元数据库。
4 、Driver : 编译器(Compiler),优化器(Optimizer),执行器(Executor )。
Driver 组件完成 HQL 查询语句从词法分析,语法分析,编译,优化,以及生成逻辑执行计划的生成。生成的逻辑执行计划存储在 HDFS 中,并随后由 MapReduce 调用执行。
Hive 的核心是驱动引擎, 驱动引擎由四部分组成:
1) 解释器:解释器的作用是将 HiveSQL 语句转换为抽象语法树(AST)
2) 编译器:编译器是将语法树编译为逻辑执行计划
3) 优化器:优化器是对逻辑执行计划进行优化
4) 执行器:执行器是调用底层的运行框架执行逻辑执行计划
3 Hive的工作原理
Hive接收到一个sql,后续的工作如下:
1) 词法分析/语法分析:使用antlr将SQL语句解析成抽象语法树-AST
2) 语义分析:从Megastore获取模式信息,验证SQL语句中队表名,列名,以及数据类型的检查和隐式转换,以及Hive提供的函数和用户自定义的函数(UDF/UAF)
3) 逻辑计划生产:生成逻辑计划-算子树
4) 逻辑计划优化:对算子树进行优化,包括列剪枝,分区剪枝,谓词下推等
5) 物理计划生成:将逻辑计划生产包含由MapReduce任务组成的DAG的物理计划
6) 物理计划执行:将DAG发送到Hadoop集群进行执行
7) 将查询结果返回
Query Compiler:
新版本的Hive也支持使用Tez或Spark作为执行引擎。