1、概念

Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言(HQL), 用于访问和分析存储在Hadoop文件中的大型数据集。

Hive核心是将HQL转换为MapReduce程序,然后将程序提交到Hadoop群集执行

Hive利用HDFS存储数据,利用MapReduce查询分析数据

2、场景

Hive能将数据文件映射成为一张表(映射)

在hive中能够写sql处理的前提是针对表,而不是针对文件,因此需要将文件和表之间的对应关系描述记录清楚

映射信息专业的叫法称之为元数据信息

hive基础 - 图1

hive基础 - 图2

用户写完sql之后, hive需要针对sql进行语法校验,并且根据记录的元数据信息解读sql背后的含义,制定执行计划,并且把执行计划转换成MapReduce程序来具体执行,把执行的结果封装返回给用户

hive基础 - 图3

3、架构

hive基础 - 图4

4、组成

hive基础 - 图5

hive基础 - 图6

hive基础 - 图7

hive基础 - 图8

5、数据模型

Data Model

数据模型:用来描述数据、组织数据和对数据进行操作,是对现实世界数据特征的描述

Hive的数据模型类似于RDBMS库表结构,此外还有自己特有模型

Hive中的数据可以在粒度级别上分为三类:

  • Table 表
  • Partition 分区
  • Bucket 分桶

Databases

Hive作为一个数据仓库,在结构上积极向传统数据库看齐,也分数据库(Schema),每个数据库下面有各自的表组成。默认数据库default(跟MySQL差不多)

Hive的数据都是存储在HDFS上的,默认有一个根目录,在hive-site.xml中,由参数hive.metastore.warehouse.dir指定。

默认值为/user/hive/warehouse。

因此,Hive中的数据库在HDFS上的存储路径为:

${hive.metastore.warehouse.dir}/databasename.db

比如,名为itcast的数据库存储路径为:

/user/hive/warehouse/itcast.db

tables表

Hive表与关系数据库中的表相同。Hive中的表所对应的数据通常是存储在HDFS中,而表相关的元数据是存储在RDBMS中

Hive中的表的数据在HDFS上的存储路径为:

${hive.metastore.warehouse.dir}/databasename.db/tablename

比如,itcast的数据库下t_user表存储路径为:/user/hive/warehouse/itcast.db/t_user

Partitions 分区

Partition分区是hive的一种优化手段表。

分区是指根据分区列(例如“日期day”)的值将表划分为不同分区。这样可以更快地对指定分区数据进行查询。

如果数据量比较大的情况下,查询效果相对比全表扫描要快一些

分区在存储层面上的表现是:table表目录下以子文件夹形式存在

一个文件夹表示一个分区。子文件命名标准:分区列=分区值

Hive还支持分区下继续创建分区,所谓的多重分区。

hive基础 - 图9

Buckets 分桶

Bucket分桶表是hive的一种优化手段表。

分桶是指根据表中字段(例如“编号ID”)的值,经过hash计算规则将数据文件划分成指定的若干个小文件

分桶规则:hashfunc(字段) % 桶个数,余数相同的分到同一个文件。

hive基础 - 图10

分桶的好处是可以优化join查询和方便抽样查询

Bucket分桶表在HDFS中表现为同一个表目录下数据根据hash散列之后变成多个文件

6、和MySQL区别

live虽然具有RDBMS数据库的外表,包括数据模型、SQL语法都十分相似,但应用场景却完全不同。

Hive只适合用来做海量数据的离线分析。Hive的定位是数据仓库,面向分析的OLAP系统。

因此时刻告诉自己,Hive不是大型数据库,也不是要取代MySQL承担业务数据处理

hive基础 - 图11

hive的元数据概述

hive metadata(元数据)

包含了hive创建的database、table、表的位置、类型、类型属性等元信息(也可以理解为在win系统中文件的属性)

元数据存储在关系型数据库中,比如hive内置的derby或者第三方比如MySQL等。

hive metastore(元数据服务,为了管理metadata)

hive基础 - 图12

为了防止通过其他客户端直接访问元数据,防止修改元数据信息,采取metastore来对元数据进行管理

metastore对外暴露服务地址,让各种客户端通过连接metastore服务,由metastore再去连接mysql或者其他数据库来获取元数据。

有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道mysql或其他数据库的用户名密码,只需要连接metastore服务即可,某种程度上也保证了hive元数据的安全。