Hive 基础

Apache Hive 概述

什么是Hive?

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

Hive核心是将 HQL转换为MapReduce 程序,然后将程序提交到 Hadoop 群集执行。Hive 由 Facebook 实现并开源。

image-20211114160002373

使用Hive的原因?

使用Hadoop MapReduce直接处理数据所面临的问题:

  • 人员学习成本太高 需要掌握java语言
  • MapReduce实现复杂查询逻辑开发难度太大

使用Hive处理数据的好处:

  • 操作接口采用类 SQL 语法,提供快速开发的能力(简单、容易上手)
  • 避免直接写 MapReduce,减少开发人员的学习成本
  • 支持自定义函数,功能扩展很方便
  • 背靠Hadoop,擅长存储分析海量数据集

Hive与Hadoop的关系

从功能来说,数据仓库软件,至少需要具备下述两种能力:

  • 存储数据的能力
  • 分析数据的能力

Hive 作为一款大数据时代的数据仓库软件,当然也具备上述两种能力。只不过 Hive 并不是自己实现了上述两种能力,而是借助 Hadoop。

Hive 利用 HDFS 存储数据,利用 MapReduce 查询分析数据。Hive 的最大的魅力在于用户专注于编写 HQL,Hive 帮用户转换成为 MapReduce 程序完成对数据的分析。

image-20211114160217225

功能实现关键

映射信息记录

映射在数学上称之为一种对应关系,比如 y=x+1,对于每一个 x 的值都有与之对应的 y 的值。在 Hive 中能够写 sql 处理的前提是针对表,而不是针对文件,因此需要将文件和表之间的对应关系描述记录清楚。映射信息专业的叫法称之为元数据信息(元数据是指用来描述数据的数据 metadata)。

image-20211114160419095

元数据信息包括:

  • 表对应着哪个文件(位置信息)
  • 表的列对应着文件哪一个字段(顺序信息)
  • 文件字段之间的分隔符是什么

Sql语法解析、编译

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

image-20211114160616262

Hive架构、组件

Hive 架构图

image-20211114160824946

Hive 组件

用户接口:包括 CLI、JDBC/ODBC、WebGUI。其中,CLI(command line interface)为shell命令行;Hive中的Thrift服务器允许外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议。WebGUI是通过浏览器访问Hive。

元数据存储:通常是存储在关系数据库如 mysql/derby中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。

Driver 驱动程序:包括语法解析器、计划编译器、优化器、执行器:完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有执行引擎调用执行。

执行引擎:Hive本身并不直接处理数据文件。而是通过执行引擎处理。当下Hive支持MapReduce、Tez、Spark3种执行引擎。

Hive 数据模型(Data Model)

数据模型:用来描述数据、组织数据和对数据进行操作,是对现实世界数据特征的描述。Hive 的数据模型类似于 RDBMS 库表结构,此外还有自己特有模型。

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

  • Table 表
  • Partition 分区
  • Bucket 分桶

image-20211114160934535

Databases

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

Hive 的数据都是存储在 HDFS 上的,默认有一个根目录,在 hive-site.xml 中,由参数 hive.metastore.warehouse.dir 指定。默认值为 /user/hive/warehouse。因此,Hive 中的数据库在 HDFS 上的存储路径为:${hive.metastore.warehouse.dir}/databasename.db

比如,名为 lepeng 的数据库存储路径为:/user/hive/warehouse/lepeng.db

Tables

Hive 表与关系数据库中的表相同。Hive 中的表所对应的数据是存储在 Hadoop 的文件系统中,而表相关的元数据是存储在 RDBMS 中。在 Hadoop 中,数据通常驻留在 HDFS 中,尽管它可以驻留在任何 Hadoop 文件系统中,包括本地文件系统或 S3。Hive 有两种类型的表:

  • Managed Table 内部表、托管表
  • External Table 外部表

创建表时,默是内部表。Hive 中的表的数据在HDFS上的存储路径为:${hive.metastore.warehouse.dir}/databasename.db/tablename

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

image-20211114161137752

Partitions

Partition 分区是 Hive 的一种优化手段表。分区是指根据分区列(例如“日期day”)的值将表划分为不同分区。这样可以更快地对指定分区数据进行查询。分区在存储层面上的表现是:table 表目录下以子文件夹形式存在。一个文件夹表示一个分区。

子文件命名标准:分区列=分区值

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

image-20211114161259737

Buckets

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

image-20211114161325712

分桶规则:hashfunc(ID) % 桶个数,余数相同的分到同一个文件。分桶的好处是可以优化 join 查询和方便抽样查询。Bucket 分桶表在 hdfs 中表现为同一个表目录下数据根据 hash 散列之后变成多个文件。

image-20211114161458361

Hive 虽然具有 RDBMS 数据库的外表,包括数据模型、SQL语法都十分相似,但应用场景却完全不同。Hive 只适合用来做海量数据的离线分析。Hive 的定位是数据仓库,面向分析的 OLAP 系统。因此时刻告诉自己,Hive 不是大型数据库,也不是要取代 MyDQL 承担业务数据处理。

更直观的对比请看下面这幅图:

image-20211114161535056

Hive 与传统数据库对比

Hive 虽然与 RDBMS 数据库在数据模型、SQL 语法等方面都十分相似,但应用场景却完全不同。Hive 只适合用来做海量数据的离线分析。Hive 的定位是数据仓库,面向分析的 OLAP 系统。具体的对比如下图所示:

对比项 Hive MySQL
查询语言 Hive QL SQL
数据存储位置 HDFS 块设备、本地文件系统
数据格式 用户定义 系统决定
数据更新 不支持 支持
事务 不支持 支持
执行延迟
可扩展性
数据规模
多表插入 支持 不支持

Hive 基础
https://flepeng.github.io/045-Hive-00-简介-Hive-基础/
作者
Lepeng
发布于
2025年1月1日
许可协议