Hive与传统的数据库

来源:互联网 发布:网络优化工程师qq群 编辑:程序博客网 时间:2024/05/16 08:03

1. Hive vs. 传统的数据库

Hive与传统的关系型数据库有很多类似的地方,例如对SQL的支持。但是其基于HDFS与MapReduce的事实使得它与传统的数据库在很多方面有很大的不同,在一些特性的支持下也受到底层架构的限制,但是这些限制随着版本迭代正在不断被消除,使得Hive看起来越来越像传统的数据库。

1.1 Schema on Read vs. Schema on Write

在传统的数据库中,数据在写入时就受到表模式(schema)的约束,如果写入的数据不符合模式,则会被拒绝。这种设计被称为Schema on Write,因为数据在写入的时候被校验。

Hive则不同,在写入数据的时候不会对数据做验证,而是在读数据的时候做验证,这称为Schema on Read。

这两种方式有很多权衡的地方。读时模式在数据载入的时候非常快,因为不需要对数据进行读取-解析-序列化为数据库内部的格式。载入操作只是简单的文件拷贝和移动。读时模式也更加灵活,对数据使用目的或者分析方式不同的两个人,对模式的需求也可能是不一样。例如对于年份这样的字段,如果只是想统计每年的销售额,可能字符串就能够符合要求。但是如果想对年份做一些比较或者时间计算,则需要使用Date之类的数据类型。把模式的定义交给具体使用数据的人来完成,是有很大的灵活性的。

而写时模式的查询效率则更高,因为数据库可以针对字段创建索引或者压缩。缺点是载入数据到数据库中需要比较长的时间。另外有很多场景下,在写入数据的时候是不知道应该使用什么模式的,也不能针对性地创建索引。这种情况下,Hive是一个很好的选择。

1.2 更新、事务及索引

更新、事务、索引是关系型数据库中的核心内容,但是Hive一直没有过多地涉及这些方面。因为Hive是基于HDFS及MapReduce,全表扫描以常规方式进行,但是更新是通过将数据写入到新的表来实现的。对于有大量数据的数据仓库应用来说,这种方式工作得很好。

Hive可以通过INSERT INTO插入批量的数据文件到表中,也可以使用INSERT INTO TABLE … VALUES插入SQL中指定的小批量数据。更新和操作也是可以支持的,但是HDFS不提供原地更新的功能。所以插入、更新、删除操作被存在增量文件中,增量文件定期通过MapReduce作业合并到表中。这些特性只有在启用事务的请下才使用。

Hive支持表级别和分区级别的锁机制,锁机制通过ZooKeeper透明地实现,因此用户无需显式地获取和释放锁,虽然可以通过SHOW LOCKS来查看当前哪一些锁正在使用。锁机制默认情况下是关闭的。

Hive的索引在一些场合下可以提高插叙效率,例如:

select * from t where x=a

x字段的索引可能避免Hive进行全表扫描。Hive目前支持2中索引:compact和bitmap。索引实现是通过插件的形式来提供的,因此可以根据不同需要定制不同的索引实现。

压缩索引存储的是每个值的Block数量,而不是文件的偏移量,需需要占用太多的磁盘空间,并且在值分布集中在一系列行中时,效率依然比较理想。bitmap使用压缩的bitset来存储特定的值出现在哪一些行中,通常在低维的字段中使用,例如性别、国家。

1.3 其他的SQL-on-Hadoop

自从Hive出现以来,有很多其他的SQL-on-Hadoop针对Hive的一些限制提供了解决方案。Cloudera的Impala是一个交互式的SQL引擎,在性能上相对基于MapReduce的Hive有很明显的提升。Impala在每个DataNode上运行特定的守护进程,当接受到查询请求时,Impala的任意一个守护进程接受该请求,并负责协调其他节点处理查询,协调的节点发送任务给其他节点,并汇总来自各节点的处理结果。Impala使用Hive的metastore支持Hive的格式和大部分HiveQL,因此在Hive与Impala之间的迁移很直接,也经常两者同时使用。

Hortonwork的Stinger通常支持Tez作为Hive的执行引擎,提高了Hive的性能,向量查询引擎也在性能提升上有所贡献。

其他的替代方案包括Facebook的Presto,MapR主导的Drill以及Spark SQL。Presto和Drill在架构上类似于Impala。Spark SQL将Spark作为执行引擎,从而允许在Spark应用中使用SQL查询。注意Spark SQL和Hive on Spark是两个不同的概念。Hive on Spark只是将Spark作为底层的执行引擎,仍然是Hive项目的一部分,实现了Hive的全部特性。而Spark SQL则是一个全新的SQL引擎,虽然提供了对Hive的一些兼容性支持。

Apache Phoenix则是另一个不同的SQL引擎,它建立在HBase的基础只是,给HBase穿上SQL的外衣,其Slogan叫:

We put SQL back on NoSQL.

Phoenix将元数据存储在HBase中,SQL的访问通过JDBC驱动接入,进而将SQL查询转化为HBase的扫描操作,Phoenix充分利用了HBase的coprocessor则服务端进行大量的(聚合)运算,大大提供了执行效率。

关于SQL-on-Hadoop方面的介绍,可以参考8个SQL-on-Hadoop框架.

2. HiveQL vs. SQL

HiveQL
Hive的SQL方言叫HiveQL(HQL),是SQL-92,MySQL以及Oracle SQL的一个混合.HQL对SQL-92的支持正在不断改进,其中也支持后续版本SQL的特性,例如SQL:2003的窗口函数(window function,also known as analytic function).HQL对SQL的一些扩展基于MapReduce,例如多表插入(Multitable insert),TRANSFORM,MAP,REDUCE从句。

下表是HiveQL与SQL的一个比较:

特征 SQL HiveQL 更新 UPADTE,INSERT,DELETE UPDATE,INSERT,DELETE 事务 支持 有限的支持 索引 支持 支持 数据类型 integral,floating-point,fixed-point,text and binary string,temporal Boolean,integral,floating-point,fixed-point,text and binary string,temporal,array,map,struct 函数 内置了几百个函数 内置了几百个函数 多表插入 不支持 支持 CREATE TABLE… AS SELECT SQL-92不支持,但是MySQL等提供支持 支持 SELECT SQL-92 支持 关联 SQL-92 inner,outer,semi,map,cross join 子查询 从句中 FROM,WHERE,HAVING 视图 可更新,支持物化和非物化 只读视图,不支持物化视图 扩展点 自定义函数,存储过程 自定义函数,MapReduce脚本
0 0
原创粉丝点击