Hive的数据存储(三)

时间:2024-05-22 17:57:33

1. 前言

Hive是建立在Hadoop上的数据仓库基础架构。它提供了一系列的工具,用来进行数据(ETL)提取、转化、加载。这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。Hive定义了简单的类SQL语言(HQL),它允许熟悉SQL操作的用户查询数据。作为一个数据仓库,Hive的数据管理按照使用层次可以从元数据存储、数据存储和数据交换三个方面来说。

2. 元数据存储

Hive将元数据存储在RDBMS中,有以下三种方式可以连接到数据库。

单用户模式

此模式连接到一个In-memory的数据库Derby,一般用于Unit Test。

多用户模式

通过网络连接到一个数据库中,是最常用的方式。

远程服务模式

用于非Java客户端访问元数据库,在服务器端启动MetaStoreServer,客户端利用Thrift协议通过MetaStoreServer访问元数据库。

3. 数据存储

Hive中没有专属的数据格式,也没有为数据建立索引。用户可以*组织Hive中的表,只需要在创建表的时候通告Hive数据中的列分隔符和行分隔符,就可以解析数据。Hive中的所有数据都存储在HDFS中,Hive中包含4种数据模型:Database、Table、Partition、Bucket。下面捉个讲解:

3.1 Database

这种模型相当于关系型数据库中的命名空间(namespace)。其作用是将用户和数据库的应用隔离到不同的数据库或模式中。Hive提供了:create database dbname 、 use dbname 、 drop database dbname这样的语句。

3.2 Table

Hive的表逻辑上由存储的数据和描述表格中的数据形式的相关元数据组成。元数据存储在关系数据库中。表存储的数据存放在Hive的数据仓库中,这个数据仓库是HDFS上的一个目录,该目录在hive-site.xml文件中由${Hive.metastore.warehouse.dir}指定:/user/hive/warehouse/。创建一张Hive的表,即在HDFS的仓库目录下创建一个文件夹,而表分为内部表和外部表两种。
Hive的元数据对应的表约有20个,其中和表结构信息有关的有9张,其余的十几张或为空,或只有简单的几条记录,下面给出一些表的简要说明:
Hive的数据存储(三)

Hive整个创建表的过程如下:

解析用户提交的HIve语句,对其进行解析,分解为表、字段、分区等Hive对象。
根据解析到的信息构建对应的表、字段、分区等对象,从sequence_table中获取构建对象的最新ID,与构建对象信息(名称,类型等)一同通过DAO方法写入到元数据表中,成功后将sequence_table中对应的ID+5。

3.3 Partition(分区)

Hive中分区的概念是根据”分区列“的值对表的数据进行粗略划分的机制。在Hive存储上就体现在表的主目录下的一个子目录,这个文件夹的名字就是定义的”分区列+值“。

分区以字段的形式存在表结构中,通过descibe table命令可以查看字段。但并不是对应着数据文件中的某个列的字段,它不存放实际的数据内容,仅仅是分区的表示。

用户存储的每个数据文档要放到哪个分区,由用户决定,这是单纯的数据文档的移动。即:用户在加载数据的时候必须显示的指定该部分数据放到哪个分区。

进行分区的优点是提高了查询效率。在Hive Select查询中一般会扫描整个表的内容,这样就会消耗很多时间成本。有时候我们只需要扫描表中的关心的一部分数据即可,因此建表时引入了partition的概念。如:当前互联网应用每天都要存储大量的日志文件,存储日志中必然有个属性是日志产生的日期,在产生分区的时候,就可以按照日志产生的日期列进行划分,把每一天的日志当作一个分区。

3.4 Bucket(桶)

对于每一个表(Table)或者分区,Hive可以进一步组织成桶,即桶是更为细粒度的数据划分范围。它是对数据源数据文件本身进行拆分数据,使用桶的表会将数据源文件按照一定规律进行拆分成多个文件。物理上,每个桶就是表或分区目录中的一个文件,Hive是针对某一列进行桶的组织。这里的列字段是对应于数据文件中具体某个列的Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

4. 组织成桶的好处

4.1 更高的查询处理效率

桶为表加上了额外的结构,Hive在处理有些查询时能利用这个结构。具体而言:

连接两个在(包含连接列的)相同列上划分桶的表,可以使用Map端连接(Map-Side Join)高效地实现。比如对于JOIN操作两个表有一个相同的列,如果对这两个表都进行桶操作,那么只需要保存相同列值的桶进行JOIN操作,大大减少了JOIN的数据量。

4.2 取样更高效

在处理大规模数据集的开发和修改查询阶段,如果能在数据集的一小部分数据上试运行查询,将带来很大的便利。