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的一个比较:
- Hive与传统的数据库
- Hive与传统数据库的区别
- Hive与传统数据库对比
- Hive与传统数据库比较
- Hive与传统数据库对比
- Hive简介、什么是Hive、为什么使用Hive、Hive的特点、Hive架构图、Hive基本组成、Hive与Hadoop的关系、Hive与传统数据库对比、Hive数据存储(来自学习资料)
- 一款Hadoop(Hive)与传统的RDBMS数据库(oracle、mysql、postgresql...)间进行数据传递的工具
- sqoop (Hadoop(Hive)与传统的数据库(mysql..)间进行数据的传递工具) 基础概念
- Hbase与传统数据库的区别
- 数据仓库与传统数据库的比较
- Hbase与传统数据库的区别
- Hive与数据库的异同
- Hive与数据库的异同
- Hive与数据库的异同
- Hive与数据库的异同
- hadoop与传统数据库
- 传统数据库的操作
- 传统数据库的瓶颈?
- 石人眼:傻瓜被煽动起来的后果堪忧
- Android Studio 使用xmlns:app 但 代码不提示问题的解决
- 【javase复习】## day4 抽象类、接口 ##
- Redis 整合spring ,做mysql的缓存
- Sql范式
- Hive与传统的数据库
- 数值的整数次方
- 设计模式——观察者模式和回调机制
- wireshark学习总结(2)---字节偏移过滤器
- HDU 2102 BFS A计划
- Aizu 0189 (Floyd)
- StringBuffer
- [正则表达式]-基础语法四 元字符优先级
- [Unity] 接入Facebook SDK后,导出的Eclipse项目.发布APK失败