hive基础知识

          从早期的互联网大数据爆发开始,主要的搜索引擎公司和电子商务公司就一直在和不断增长的数据进行较量。最近社交网站也遇到了同样的问题。如今,许多组织已经意识到他们所收集的数据是让他们了解用户,提高业务在市场上的表现以及提高基础架构效率的一个宝贵资源。

         Hadoop生态系统就是为处理如此大数据集二产生的一个合乎成本效益的解决方案。Hadoop实现了一个特别的计算模型,也就是mapreduce。其可以将计算任务分割成多个处理单元然后分散到一群家用的或服务器级别的硬件机器上,从而降低成本并提高水平可伸缩性。这个计算模型的下面是一个被称为Hadoop分布式文件系统(HDFS)的分布式文件系统。这个文件系统是“可插拔的”,而且现在已经出现了几个商用和开源的替代方案。

         不过,仍然存在一个挑战,那就是用户如何从一个现有的基础架构转移到Hadoop上,而这个基础架构是基于传统关系数据库和结构和查询语句的(SQL)。对于大量的SQL用户来说,这个问题如何来解决呢?

          这就是hive出现的原因,Hive提供了一个被称为Hive查询语言的sql方言,来查询存储在hadoop集群中的数据。

          Hive最适合数据仓库应用程序。使用该应用程序进行相关的静态数据分析,不需要快速响应给出结果,而且数据本身不会频繁变化。

          Hive不是一个完整的数据库。Hadoop以及hdfs的设计本身约束和局限性地限制了hive所能胜任的工作。其中最大的限制就是hive不支持记录级别的更新,插入或者删除操作。但是用户可以通过查询生成新表或者将查询结果导入到文件中。同时,因为hive是面向批处理的系统,而mapreduce任务(job)的启动过程需要消耗较长的时间,所以hive查询延时比较严重。传统数据库中在秒级可以完成的查询,在hive中,即使数据集相对较小,往往也需要执行更长的时间。最后需要说明的是,hive不支持事务。

1.1 Hadoop和Map Reduce综述

虽然用户无需精通Map Reduce就可以使用Hive,但是理解Map Reduce的基本原理将有助于用户了解Hive在底层是如何运作的,以及如何才能更高效的使用Hive。

Map Reduce

    Map Reduce是一种计算模型,该模型可将大型数据处理任务分解成很多单个,可以在服务器集群中并行执行的任务。这些任务的计算结果合并在一起来计算最终的结果。

MapReduce这个术语来自于两个基本数据转换操作:Map过程和reduce过程。一个map操作会将集合中的元素从一种形式转换成另一种形式。在这种情况下,输入的键值对会被转换成零到多个键-值对输出。其中输入输出的键必须完全不同,而输入、输出的值则可能完全不同。

在MapReduce计算框架中,某一个键的所有键值对都会被分发到同一reduce中。确切的说这个键和这个键所对应的值都会被传递给同一个reducer。reduce过程的目的是将值得集合转换成一个值,或者转换成另一个集合。这个reduce最终会产生 一个键值对。再次说明一下,输入和输出的键可能是不同的。需要说明的是,如果job不需要reduce过程的话,那么也是可以无reduce过程。

Hadoop提供了一套基础的设施来处理大多数困难的工作以保证任务能够执行成功。例如:Hadoop决定如果将提交的job分解成多个map和reduce来执行。它将会对这些task进行调度并为其分配合适的资源,决定将某个task分配到集群中哪个位置。它会监控每一个task以确保其成功完成,并重启一些失败的task。

Hadoop分布式文件系统(HDFS),或者一个同类的分布式文件系统,管理着集群中的数据。每个数据库都会被冗余多份(通常默认冗余3份),这样可以保证不会因单个磁盘或者服务器的损坏导致数据丢失。同时,因为其目标是优化处理非常大的数据集,所以HDFS以及类似的文件系统所使用的数据都非常大,通常是64MB或者是这个值得若干倍。这么大的数据块可以在硬盘上连续进行存储,这样可以保证以最小的磁盘寻址次数来进行写入和读取。从而最大化提高读写性能。

 hadoop神奇的地方一部分在于后面要进行的Sort和Shuffle过程。Hadoop会按照键来对键值对进行排序,然后“重新洗牌”,将所有具有相同键值对分发到同一个reduce中。这里有多种方式可以用于决定哪个reduce获取哪个范围内的键对应得数据。

1.2 Hadoop生态系统中的hive

hive不仅提供了一个熟悉sql的用户所能熟悉的编程模型,还消除了大量通用的代码。甚至是那些有时是不得不使用Java编写令人棘手的代码。

这也是就为什么hive对于Hadoop如此重要的原因,无论用户是DBA还是Java开发工程师。Hive对于让你花费相当少的精力就可以完成大量的工作。Hive发行版中附带的模块有CLI,一个称为HIve网页界面(HWI)的简单网页界面,以及可以通过JDBC,ODBC和一个Thrift服务器进行编程访问的几个模块。

所有的命令和查询都会进入到Driver(驱动模块),通过该模块对数据进行解析编译,对需求的计算进行优化,然后按照指定的步骤执行(通常是启动多个MapRuce任务来执行)。当需要启动MapReduce任务时,Hive本身不会生成JavaMapReduce算法程序的。相反,Hive通过一个表示job执行计划的xml文件驱动执行内置的、原生的Mapper和Reducer模块。换句话说,这些通用的模块函数类似于微型语言翻译程序,而这个驱动计算的“语言”是以xml形式编译的。

Hive通过JobTracker通信来初始化MapReduce任务(job),而不必部署 在JobTracker所在的管理节点上执行。在大型集群中,通常会有网关机专门部署像Hive这样的工具。在这些网关机上可以远程和管理节点上的JobTracker通信来执行任务(job)。通常要处理的数据文件是存储在HDFS中的,而HDFS是由NameNode进行管理的。

MetaStore(元数据存储)是一个独立的关系型数据块(通常是一个MySQL实例)。Hive会在其中保存表模式和其他元数据。Hive是最适合于数据仓库程序的。对于数据仓库程序不需要实时响应查询,不需要记录级别的插入、更新和删除。

 

相关推荐