11.1 Hive简介
Hive是一个基于Hadoop文件系统之上的数据仓库架构。它为数据仓库的管理提供了许多功能:数据ETL(抽取、转换和加载)工具、数据存储管理和大型数据集的查询和分析能力。同时Hive定义了类SQL的语言—Hive QL。Hive QL允许用户进行和SQL相似的操作,还允许开发人员方便地使用Mapper和Reducer操作,这对MapReduce框架是一个强有力的支持。
由于Hadoop是批量处理系统,任务是高延迟性的,在任务提交和处理过程中会消耗一些时间成本。同样,即使Hive处理的数据集非常小(比如几百MB),在执行时也会出现延迟现象。这样,Hive的性能就不可能很好地和传统的Oracle数据库进行比较了。Hive不提供数据排序和查询cache功能,不提供在线事务处理,也不提供实时的查询和记录级的更新,但Hive能更好地处理不变的大规模数据集(例如网络日志)上的批量任务。所以,Hive最大的价值是可扩展性(基于Hadoop平台,可以自动适应机器数目和数据量的动态变化)、可延展性(结合MapReduce和用户定义的函数库)、良好的容错性和低约束的数据输入格式。
Hive本身建立在Hadoop的体系架构上,提供了一个SQL的解析过程,并从外部接口中获取命令,以对用户指令进行解析。Hive可将外部命令解析成一个Map-Reduce可执行计划,并按照该计划生成MapReduce任务后交给Hadoop集群进行处理,Hive的体系结构如图11-1所示。
11.1.1 Hive的数据存储
Hive的存储是建立在Hadoop文件系统之上的。Hive本身没有专门的数据存储格式,也不能为数据建立索引,因此用户可以非常自由地组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符就可以解析数据了。
Hive中主要包含四类数据模型:表(Table)、外部表(External Table)、分区(Partition)和桶(Bucket)。
Hive中的表和数据库中的表在概念上是类似的,在Hive中每个表都有一个对应的存储目录。例如,一个表htable在HDFS中的路径为/datawarehouse/htable,其中,/datawarehouse是在hive-site.xml配置文件中由${hive.metastore.warehouse.dir}指定的数据仓库的目录,所有的表数据(除了外部表)都保存在这个目录中。
Hive中的每个分区都对应数据库中相应分区列的一个索引,但是其分区的组织方式和传统关系型数据库不同。在Hive中,表中的一个分区对应表下的一个目录,所有分区的数据都存储在对应的目录中。例如,htable表中包含的ds和city两个分区,分别对应两个目录:对应ds=20100301,city=Beijing的HDFS子目录为/datawarehouse/htable/ds=20100301/city=Beijing;对应ds=20100301,city=Shanghai的HDFS子目录为/datawarehouse/htable/ds=20100301/city=Shanghai。
图 11-1 Hive的体系结构
桶在对指定列进行哈希(Hash)计算时,会根据哈希值切分数据,使每个桶对应一个文件。例如,将属性列user列分散到32个桶中,先要对user列的值进行hash计算,对应哈希值为0的桶写入HDFS的目录为/datawarehouse/htable/ds=20100301/city=Beijing/part-00000;对应哈希值为10的HDFS目录为/datawarehouse/htable/ds=20100301/city=Beijing/part-00010,依此类推。
外部表指向已经在HDFS中存在的数据,也可以创建分区。它和表在元数据的组织上是相同的,而实际数据的存储则存在较大差异,主要表现在以下两点上。
1)创建表的操作包含两个步骤:表创建过程和数据加载步骤(这两个过程可以在同一语句中完成)。在数据加载过程中,实际数据会移动到数据仓库目录中,之后的数据访问将会直接在数据仓库目录中完成。在删除表时,表中的数据和元数据将会被同时删除。
2)外部表的创建只有一个步骤,加载数据和创建表同时完成,实际数据存储在创建语句LOCATION指定的HDFS路径中,并不会移动到数据仓库目录中。如果删除一个外部表,仅删除元数据,表中的数据不会被删除。