Hive大数据存储与处理
上QQ阅读APP看书,第一时间看更新

1.2.3 Hive设计特性

Hive提供了一种比MapReduce更简单、更优化的数据开发方式,越来越多的人开始使用Hive。

1.Hive的特点

Hive可让普通数据库用户从现有的、基于关系数据库和SQL的数据基础架构转移到Hadoop上。对于SQL用户而言,Hive提供了HQL,可用于查询HDFS上的数据,减少开发人员的学习成本,使得开发人员可以使用一种熟悉的语言操作和分析HDFS上的数据。

Hive具有如下特点。

(1)HQL与SQL有着相似的语法,大大提高了开发人员的开发效率。

(2)Hive支持运行在不同的框架上,包括YARN、Tez、Spark、Flink等。

(3)Hive支持HDFS与HBase上的即席查询(Ad-Hoc)。

(4)Hive支持用户自定义的函数、脚本等。

(5)Hive支持JDBC与ODBC,建立了自身与ETL、BI工具的通道。

Hive还具有以下优势。

(1)可扩展。Hive可以自由扩展集群的规模,一般情况下无须重启服务。

(2)可延展。Hive支持用户自定义函数,用户可根据自己的需求来编写自定义函数。

(3)可容错。Hive良好的容错性使得当节点出现问题时HQL语句仍可完成执行。

简而言之,当使用Hive时,操作接口采用类SQL语法,提高了快速开发的能力,避免了编写复杂的MapReduce任务,减少了开发人员的学习成本,而且扩展很方便。

2.Hive的适用场景

Hive构建在基于静态批处理的Hadoop之上,Hadoop通常都有较高的延迟并且在作业提交和调度时需要大量的开销,故Hive有特定的适用场景。

Hive并不能在大数据集上实现低延迟的快速查询,例如,Hive在几百兆字节的数据集上执行查询一般有分钟级的延迟。因此Hive并不适合那些需要低延迟的应用,例如,在联机事务处理(OnLine Transaction Processing,OLTP)中,Hive查询操作过程严格遵守Hadoop MapReduce的作业执行模型,Hive将用户的HQL语句通过解析器转换为MapReduce作业提交到Hadoop集群上,Hadoop监控作业执行过程,然后返回作业执行结果给用户。Hive并非为OLTP而设计,Hive并不提供实时的查询和基于行级的数据更新操作。

Hive的最佳适用场景是大数据集的批处理作业,如网络日志分析。Hive封装了Hadoop的数据仓库工具,使用类SQL的HQL实现数据查询,所有的数据都存储在与Hadoop兼容的文件系统中,如Amazon S3、HDFS。Hive在加载数据过程中不会对数据进行任何修改和添加,只是将数据移动到HDFS中Hive设定的目录下。

3.Hive与传统数据库的区别

在Hadoop诞生前,大部分的数据仓库都是基于关系数据库实现的,而数据仓库应用程序是建立在数据仓库的基础上的数据应用,包括报表展示、即席查询、数据分析、数据挖掘等。数据仓库源自数据库而又不同于数据库,主要区别在于数据仓库适合联机分析处理(OnLine Analytical Processing,OLAP),通常用于对某些主题的历史数据进行分析;而数据库适合OLTP,通常用于在数据库联机时对业务数据进行添加、删除、修改、查询等操作。Hive的早期版本或新版本在默认情况(系统默认状态)下并不支持事务,一般来说并不适合OLTP。

Hive与关系数据库有很多相同的地方,包括查询语言与数据存储模型等。HQL并不完全遵循SQL92标准,如HQL只支持在FROM子句中使用子查询,并且子查询必须有名字。最重要的是,HQL需在Hadoop上执行,而非在传统的数据库上执行。在数据存储模型方面,数据库、表都与传统数据库的概念相同,但Hive中增加了分区和分桶的概念。

Hive与关系数据库也有其他不同的地方,如在关系数据库中,表的Schema在数据加载时就已确定,若不符合Schema则会加载失败;而Hive在加载数据过程中不对数据进行任何验证,只是简单地将数据复制或移动到表对应的目录下。加载数据过程中不对数据进行验证是Hive能够支持大规模数据的基础之一。事务、索引以及更新是关系数据库非常重要的特性,鉴于Hive的设计初衷,事务、索引以及更新特性一开始就不是Hive设计目标。Hive与关系数据库的对比如表1-3所示。

表1-3 Hive与关系数据库的对比

Hive与关系数据库存在较大差异,Hive支持不同的存储类型,如纯文本文件、HBase中的文件;Hive将元数据保存在关系数据库中,大大减少了在查询过程中执行语义检查的时间;Hive可以直接使用存储在HDFS中的数据;Hive内置有大量用户函数来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF函数完成内置函数无法实现的操作,同时提供类SQL,将SQL查询转换为MapReduce任务在Hadoop集群上执行。