什么是Hive?
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL(Hive SQL)查询功能,其底层数据是存储在 HDFS 上。本质是将 SQL 语句转换为 MapReduce 任务运行,使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据,适用于离线的批量数据计算。
Hive的特点
- 支持创建索引,优化数据查询。
- 支持不同的存储类型,将元数据保存在关系数据库中,大大减少了在查询过程中执行语义检查的时间。
- 可以直接使用存储在Hadoop 文件系统中的数据。内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作。
- 类SQL 的查询方式,将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行。
- Hive 中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。
- 可扩展性高,Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
- 延展性强,Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
- 容错性高,良好的容错性,节点出现问题SQL仍可完成执行。
- 不支持记录级别的增删改操作,但是用户可以通过查询生成新表或者将查询结果导入到文件中
- 查询延时很严重,因为 MapReduce Job 的启动过程消耗很长时间,所以不能用在交互查询系统中。
- 不支持事务,因为不没有增删改,所以主要用来做联机分析处理,而不是联机事务处理。
Hive的架构
Hive的架构如图所示:
Hive的体系结构可以分为以下几部分:
- 用户接口:Client
CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)
- 元数据:Metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore - Hadoop
使用HDFS进行存储,使用MapReduce进行计算。 驱动器:Driver
解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
编译器(Physical Plan):将AST编译生成逻辑执行计划。
优化器(Query Optimizer):对逻辑执行计划进行优化。
执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。Hive的元数据模式
Hive将元数据存储在RDBMS(关系数据库管理系统)中,有三种模式可以连接到数据库。
元数据库内嵌模式:此模式连接到一个In-memory 的数据库Derby,一般用于Unit Test。
- 元数据库mysql模式:通过网络连接到一个数据库中,是最经常使用到的模式。
- MetaStoreServe访问元数据库模式:用于非Java客户端访问元数据库,在服务器端启动MetaStoreServer,客户端利用Thrift协议通过MetaStoreServer访问元数据库。
对于数据存储,Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。
Hive中所有的数据都存储在HDFS中,存储结构主要包括数据库、文件、表和视图。
Hive中包含以下数据模型:Table内部表,External Table外部表,Partition分区,Bucket桶。
Hive默认可以直接加载文本文件,还支持sequence file 、RCFile。
Hive工作原理
hive的工作原理可以用如图所示理解:
- Hive构建在Hadoop之上
- HQL中对查询语句的解释、优化、生成查询计划是由Hive完成的
- 所有的数据都是存储在Hadoop中。
- 查询计划被转化为MapReduce任务,在Hadoop中执行(有些查询没有MR任务,如:select * from table)
- Hadoop和Hive都是用UTF-8编码的
附参考资料:
Hive