Hive是基于Hadoop构建的一套数据仓库分析系统,它提供丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据。Hive将数据存储在数据仓库中,通过自己的SQL去查询分析数据内容,这套SQL简称HiveSQL。它与关系型数据库的SQL略有不同,但支持绝大多数的语句,如DDL、DML以及常见的聚合函数、连接查询、条件查询。
Hive主要包括以下几个部分:
1) 用户接口:CLI,Client和WUI,用户通过用户接口访问Hive。
2) 元数据存储:Hive通常部署在多用户环境中,为了避免每个用户在不同的地方建立不同的元数据,需要一个共享的数据库服务器,其上创建一个符合JDBC的数据库作为Hive的元数据存储数据库metastore_db,然后将Hive的安装配置都指向它即可。
3) 解释器、编译器、优化器、执行器:解释器、编译器、优化器完成HiveQL查询语句从词法分析、语法分析、编译、优化性能以及查询计划的生成。最后将生成计划,由执行器调用程序执行。
4) Hadoop:由解释器、编译器、优化器生成的计划存储在HDFS中,执行器调用MapReduce程序完成语句的调用分析。
与普通数据库的关系:
查询语言不同。普通关系数据库采用SQL查询语言,而Hive有专门针对自己特性开发的类SQL的HiveQL语言。
1) 数据存储位置不同。Hive的数据存储在HDFS中,普通的关系数据库则将数据保存在本地文件系统或块中。
2) 数据格式不同。Hive没有定义专门的数据格式,用户自己定义数据格式及读取文件数据的方法。所以,在数据加载入Hive时不需要对数据本身做任何改变。而普通的关系数据库有固定的数据格式以及各自的存储引擎。所有数据按照数据格式组织存储,加载的过程也会比较耗时。
3) 数据更新不同。Hive是Hadoop基础上的数据仓库架构,其中的内容时读多写少的,故Hive不支持数据的添加和改写,加载数据时,数据就已被确定。而普通的关系数据库中的数据经常需要修改,因此有固定的SQL语言实现数据的添加和修改。
4) 索引不同。如上所述,Hive加载数据时不对数据进行修改和扫描,所以,也没有对数据的key建立索引。Hive采用“分区”或者“分桶”等来加快访问数据的速度,因此对于少量特定条件数据的访问,数据库有很高的效率以及较低的延迟。这也是Hive不适合在线查询数据的原因。
5) 执行方式不同。Hive查询的执行是通过MapReduce实现。普通关系数据库有自己的执行引擎。
6) 执行延迟不同。对于小规模的数据,Hive无法体现其MapReduce分布式计算的特点,且MapReduce本身具有较高的延迟,Hive没有索引,故执行延迟较高,普通关系数据库相比有较低的执行延迟。但对于大规模数据,Hive相比普通数据库,延迟较低。
7) 可扩展性不同。Hive的可扩展性和Hadoop的可扩展性是一致的,几千台甚至上万台。
8) 数据规模不同。Hive倾向于处理大规模的数据,普通数据库可支持的数据规模较小。