Hive Tutorial For Beginners
一、Hive历史(History of Hive)
Facebook 在面对日益增长的大数据时,选择了 Hadoop 作为解决方案。
但问题在于,许多用户并不熟悉 Java 或其他编程语言,这使得使用 Hadoop 的 MapReduce 变得复杂且不便。
为了简化这一过程,Hive 应运而生。
Hive 的设计灵感来自于 SQL,它引入了表格和列的概念,让用户可以像使用数据库一样操作数据。
这样,用户无需编写冗长复杂的 MapReduce 代码,只需用 SQL 查询就能处理数据。这种改变极大地提高了 Hadoop 的易用性,让更多人能够轻松上手和管理大数据。
二、Hive是什么?(What is Hive?)
Hive 是一个数据仓库系统,用于查询和分析存储在 Hadoop 分布式文件系统(HDFS)中的大型数据集。
Hive使用一种名为 HiveQL 的查询语言,这种语言类似于 SQL,简化了数据操作过程。
基本流程:
- 用户编写 HiveQL 查询 - 用户用 HiveQL 编写查询语句,这种语言与 SQL 相似。
- Hive 将查询转换为 MapReduce 任务 - Hive 自动将这些查询转换为 MapReduce 任务。
- MapReduce 任务执行数据处理 - 这些任务在 Hadoop 集群上运行,完成数据的处理和分析。
三、Hive架构(Architecture of Hive)
1. Hive 客户端接口
1.1 Hive CLI (Command Line Interface)
- 定义:一个命令行工具,用户可以通过它直接与 Hive 交互。
- 作用:执行 HiveQL 查询、管理数据库和表格,以及查看查询结果。
1.2 Hive Web Interface
- 定义:基于 Web 的界面,用户通过浏览器访问。
- 作用:提供一个可视化的操作平台,用于提交查询、管理数据以及查看结果。
2. Hive API 接口
2.1 Hive Thrift Client
- 定义:通过 Apache Thrift 协议与 Hive 进行通信的客户端。
- 作用:允许不同编程语言的应用程序(如 Java、Python、C++)通过 Thrift 协议与 Hive 进行交互。
2.2 Hive JDBC Driver
- 定义:Java 数据库连接(JDBC)驱动程序,用于连接 Hive 数据库。
- 作用:允许 Java 应用程序通过 JDBC API 执行 HiveQL 查询,并处理查询结果。
2.3 Hive ODBC Driver
- 定义:开放数据库连接(ODBC)驱动程序,用于连接 Hive。
- 作用:使各种应用程序能够通过 ODBC 接口访问 Hive 数据库,执行查询和处理结果。
3. Hive Server
- 定义:Hive Server 是 Hive 的核心服务,负责处理客户端请求。
- 作用:它接收来自客户端的查询请求,并将这些请求转发给 Hive Driver。
4. Hive Driver
- 定义:Hive Driver 负责查询的处理和执行。
- 作用:将 HiveQL 查询转换成 MapReduce 作业或其他计算任务,并将结果返回给 Hive Server。
-
Compiler(编译器)
- 作用:将 HiveQL 查询传递给编译器。
- 过程:在编译阶段,查询会被检查和分析,以确保语法和语义正确。
-
Optimizer(优化器)
- 作用:对编译后的查询进行优化。
- 过程:生成一个优化后的逻辑计划,这个计划以 MapReduce 和 HDFS 任务的图形形式表现。
-
Executor(执行器)
- 作用:执行优化后的任务。
- 过程:在最终步骤,执行器运行生成的任务并处理实际的数据操作。
5. Metastore
- 定义:Hive Metastore 是一个集中式的元数据仓库。
- 作用:存储 Hive 表的结构信息、数据位置和分区信息。通常使用关系型数据库(如 Apache Derby(Hive默认的元数据存储数据库,不支持多用户并发访问。)、MySQL(支持多用户并发访问,生产环境使用的较多。)、PostgreSQL)来存储元数据。
6. Processing and Resource Management
-
MapReduce v1 / MapReduce v2
- 定义:MapReduce 是 Hadoop 的计算模型,用于处理和计算数据。
- 作用:Hive 将查询转换为 MapReduce 作业以进行分布式计算。MapReduce v2(YARN)提供了改进的资源管理和调度能力。
-
Tez
- 定义:Apache Tez 是一个用于改进 Hadoop 作业的执行框架。
- 作用:Tez 提供了比 MapReduce 更高效的执行模型,优化了 Hive 查询的性能。
- YARN
- 定义:Yet Another Resource Negotiator(YARN)是 Hadoop 的资源管理器。
- 作用:负责资源的分配和管理,为 Hive 作业提供计算资源。
7. Distributed Storage
- HDFS
- 定义:Hadoop Distributed File System(HDFS)是 Hadoop 的分布式存储系统。
- 作用:存储 Hive 表的数据,提供高吞吐量的数据访问。
四、Hive 数据流动(DataFlow in Hive)
Hive 数据流动过程
-
用户查询 (executeQuery)
- 描述:用户通过 Hive 客户端提交查询请求。
-
驱动程序 (Driver)
- 步骤:
- Compiler:将查询传递给编译器。
- 操作:编译器检查和分析查询的正确性,并生成执行计划。
- 步骤:
-
获取元数据 (getMetadata)
- 描述:驱动程序请求 Hive Metastore 获取表结构和元数据信息。
4. 发送元数据 (sendMetadata)
- 描述:将获取到的元数据传递给编译器以便生成执行计划。
-
发送执行计划 (sendPlan)
- 描述:驱动程序将生成的执行计划发送到执行引擎。
-
执行计划 (executePlan)
- 描述:执行引擎(通常是 MapReduce 或其他计算框架)根据执行计划进行数据处理。
-
元数据操作 (Metadata ops)
- 描述:在执行过程中,可能会对 Hive Metastore 进行操作,例如更新表的统计信息或数据结构。
五、Hive数据建模(Hive Data Modelling)
表 (Tables)
- 描述:在 Hive 中,表的创建方式与关系数据库管理系统 (RDBMS) 类似。可以定义表的结构并将数据加载到表中。
分区 (Partitions)
- 描述:表中的数据可以按照分区键(Partition Key)进行分区。这种方式将表中的数据按特定条件(如日期、地区等)进行组织,从而使得数据查询更加高效。例如,将销售数据按月份进行分区。(避免全表扫描,查询某个日期的数据,直接查分区表即可。)
分桶 (Buckets)
- 描述:在分区的基础上,数据还可以进一步分为若干个桶(Buckets)。桶将分区内的数据进行进一步划分,目的是提升查询效率和性能。例如,将分区内的数据按哈希值划分为多个桶。
六、Hive数据类型(Hive Data Types)
- 原始数据类型 (Primitive Data Types)
- 数值类型 (Numeric Data Types):包括
INT
、BIGINT
、FLOAT
、DOUBLE
等,用于表示不同范围的数值。
- 字符串类型 (String Data Type):包括
STRING
、VARCHAR
、CHAR
,用于表示文本数据。
- 日期/时间类型 (Date/Time Data Type):包括
DATE
、TIMESTAMP
,用于表示日期和时间。
- 其他类型 (Miscellaneous Data Type):如
BOOLEAN
,用于表示布尔值。
- 复杂数据类型 (Complex Data Types)
- 数组 (Arrays):一种有序的数据集合,可以包含相同类型的多个元素。
- 映射 (Maps):由键值对组成的集合,键和值可以是不同的数据类型。
- 结构体 (Structs):包含多个不同数据类型字段的复合数据类型,类似于表的行。
- 单位 (Units):在某些情况下用于表示具体的数量单位,例如高精度数值的
DECIMAL
类型可用于处理货币等需要精确度的数据。
七、Hive运行模式(Different modes of Hive)
Hive运行模式主要取决于 数据节点的数量和规模。
-
Local Mode(本地模式):用于在单个数据节点上处理较小的数据集,适合数据量小且存在于本地机器上的场景,处理速度较快。
-
MapReduce Mode(MapReduce模式):用于在多个数据节点上处理分布式的大数据集,适合数据量大且分布在多个节点上的场景,能更高效地处理大规模数据。
八、Hive与传统数据库区别(Difference between Hive and RDBMS)
特性 | Hive | RDBMS |
---|---|---|
模式应用时机 | 读取时强制模式(Schema on Read):数据存储时不强制定义模式,查询时才应用模式。例如:存储日志文件时不需要定义结构,查询时可以指定数据格式。 | 写入时强制模式(Schema on Write):数据在存储之前必须符合预定义的模式。例如:创建表时需要定义列名、数据类型等结构。 |
数据规模 | 通常在PB级别:适合处理大规模数据集,如社交媒体数据、网页日志等。例如:Facebook 使用 Hive 处理大量用户数据。 | 通常在TB级别:适合中小规模的数据集,如交易数据、客户信息等。例如:银行系统使用 RDBMS 管理账户数据。 |
操作模式 | 写一次,读多次:数据一旦写入后会被频繁读取但很少修改。例如:分析用户行为数据时,数据被写入一次然后频繁读取生成报告。 | 读写多次:数据可以被频繁读取和写入。例如:电子商务网站的订单系统需要频繁读写订单数据。 |
功能 | 数据仓库:Hive 本质上是一个数据仓库,是一个大数据分析平台,虽然支持 SQL 查询,但主要用于大数据分析,而非事务处理。 | 关系型数据库:处理结构化数据并支持事务处理(ACID 属性),适合日常的业务数据管理和事务处理。 |
扩展性 | 高扩展性:能够通过添加更多节点来处理更大规模的数据,成本相对较低。例如:使用 Hadoop 集群扩展 Hive 的计算能力。 | 扩展性相对较差:通常需要高成本的硬件升级或复杂的分布式架构来扩展。例如:扩展 SQL Server 可能需要昂贵的服务器和存储设备。 |
九、Hive特点(Features of Hive)
-
表结构:Hive 使用表的方式来组织数据,这与传统的关系型数据库系统(RDBMS)类似。用户可以创建、修改和查询表,表的列和数据类型也可以定义,这使得 Hive 的使用更符合 SQL 的传统概念,易于理解和上手。
-
并发查询:Hive 支持多个用户同时进行数据查询。通过 HiveQL(Hive 查询语言),用户可以并发执行查询操作,这对于大规模的数据分析和报告生成非常有用。
-
简化语言:HiveQL 是一种类 SQL 语言,设计上更接近于传统 SQL 语法,因此用户不需要掌握复杂的编程代码。它简化了数据操作和分析的过程,使得编写查询变得更加直观和高效。
-
数据格式支持:Hive 能够处理多种数据格式,包括文本格式、压缩格式(如 Gzip)、列式存储格式(如 Parquet 和 ORC)。这种灵活性使得 Hive 能够高效地处理不同类型和结构的数据,适应各种数据存储和分析需求。