第1章 基础知识
Hive编程指南
从早期的互联网主流大爆发开始,主要的搜索引擎公司和电子商务公司就一直在和不断增长的数据进行较量。最近,社交网站也遇到了同样的问题。如今,许多组织已经意识到他们所收集的数据是让他们了解他们的用户,提高业务在市场上的表现以及提高基础架构效率的一个宝贵的资源。
Hadoop生态系统就是为处理如此大数据集而产生的一个合乎成本效益的解决方案。Hadoop实现了一个特别的计算模型,也就是MapReduce,其可以将计算任务分割成多个处理单元然后分散到一群家用的或服务器级别的硬件机器上,从而降低成本并提供水平可伸缩性。这个计算模型的下面是一个被称为Hadoop分布式文件系统(HDFS)的分布式文件系统。这个文件系统是“可插拔的”,而且现在已经出现了几个商用的和开源的替代方案。
不过,仍然存在一个挑战,那就是用户如何从一个现有的数据基础架构转移到Hadoop上,而这个基础架构是基于传统关系型数据库和结构化查询语句(SQL)的。对于大量的SQL用户(包括专业数据库设计师和管理员,也包括那些使用SQL从数据仓库中抽取信息的临时用户)来说,这个问题又将如何解决呢?
这就是Hive出现的原因。Hive提供了一个被称为Hive查询语言(简称HiveQL或HQL)的SQL方言,来查询存储在Hadoop集群中的数据。
SQL知识分布广泛的一个原因是:它是一个可以有效地、合理地且直观地组织和使用数据的模型。即使对于经验丰富的Java开发工程师来说,将这些常见的数据运算对应到底层的MapReduce Java API也是令人畏缩的。Hive可以帮助用户来做这些苦活,这样用户就可以集中精力关注于查询本身了。Hive可以将大多数的查询转换为MapReduce任务(job),进而在介绍一个令人熟悉的SQL抽象的同时,拓宽Hadoop的可扩展性。如果用户对此存在疑惑,请参考稍后部分的第1.3节“Java和Hive:词频统计算法”中的相关介绍。
Hive最适合于数据仓库应用程序,使用该应用程序进行相关的静态数据分析,不需要快速响应给出结果,而且数据本身不会频繁变化。
Hive不是一个完整的数据库。Hadoop以及HDFS的设计本身约束和局限性地限制了Hive所能胜任的工作。其中最大的限制就是Hive不支持记录级别的更新、插入或者删除操作。但是用户可以通过查询生成新表或者将查询结果导入到文件中。同时,因为Hadoop是一个面向批处理的系统,而MapReduce任务(job)的启动过程需要消耗较长的时间,所以Hive查询延时比较严重。传统数据库中在秒级别可以完成的查询,在Hive中,即使数据集相对较小,往往也需要执行更长的时间[1]。最后需要说明的是,Hive不支持事务。
因此,Hive不支持OLTP(联机事务处理)所需的关键功能,而更接近成为一个OLAP(联机分析技术)工具。但是我们将会看到,由于Hadoop本身的时间开销很大,并且Hadoop所被设计用来处理的数据规模非常大,因此提交查询和返回结果是可能具有非常大的延时的,所以Hive并没有满足OLAP中的“联机”部分,至少目前并没有满足。
如果用户需要对大规模数据使用OLTP功能的话,那么应该选择使用一个NoSQL数据库,例如,和Hadoop结合使用的HBase[2]及Cassandra[3]。如果用户使用的是Amazon弹性MapReduce计算系统(EMR)或者弹性计算云服务(EC2)的话,也可以使用DynamoDB[4]。用户甚至可以和这些数据库(还包括其他一些数据库)结合来使用Hive,这个我们会在第17章进行介绍。
因此,Hive是最适合数据仓库应用程序的,其可以维护海量数据,而且可以对数据进行挖掘,然后形成意见和报告等。
因为大多数的数据仓库应用程序是使用基于SQL的关系型数据库实现的,所以Hive降低了将这些应用程序移植到Hadoop上的障碍。用户如果懂得SQL,那么学习使用Hive将会很容易。如果没有Hive,那么这些用户就需要去重新学习新的语言和新的工具后才能进行生产。
同样地,相对于其他Hadoop语言和工具来说,Hive也使得开发者将基于SQL的应用程序移植到Hadoop变得更加容易。
不过,和大多数SQL方言一样,HiveQL并不符合ANSI SQL标准,其和Oracle,MySQL,SQL Server支持的常规SQL方言在很多方面存在差异(不过,HiveQL和MySQL提供的SQL方言最接近)。
因此,本书共有两个目的。其一,本书提供了一个针对所有用户的介绍。这个介绍会比较综合,并且会使用例子来进行讲解。适用的用户包括开发者、数据库管理员和架构师,以及其他(如商业分析师等)非技术类用户。
其二,本书针对开发者和Hadoop管理员等需要深入了解Hive技术细节的用户提供了更详尽的讲述,以帮助这些用户学习如何优化Hive查询性能,如何通过用户自定义函数和自定义数据格式等,来个性化使用Hive。
因为Hive缺少好的文档,所以我们经历了不少的挫折才完成了这本书。特别是对于那些非开发者以及不习惯通过查看项目BUG记录和功能数据库、源代码等途径来获取其所需信息的用户,Hive并没有提供好的文档。Hive Wiki[5]提供的信息价值很大,但是其中的解释有时太少了,而且常常没有进行及时的更新。我们希望本书可以弥补这些不足,可以提供一个对于Hive的所有基本功能以及如何高效使用这些功能的综合性的指南[6]。