本章目标
通过本章学习,您将能够: - 理解Apache Hive的基本概念和设计理念 - 掌握Hive的核心架构组件 - 了解Hive在大数据生态系统中的定位 - 理解Hive的工作原理和执行流程 - 掌握Hive的优势和局限性
1.1 什么是Apache Hive
1.1.1 Hive简介
Apache Hive是一个建立在Hadoop之上的数据仓库软件,它提供了一种类SQL的查询语言(HiveQL),使得熟悉SQL的用户能够轻松地查询和分析存储在Hadoop分布式文件系统(HDFS)中的大规模数据集。 核心特点: - SQL-like语法:提供HiveQL查询语言,语法类似于SQL - 大数据处理:能够处理PB级别的数据 - 分布式计算:基于Hadoop MapReduce或其他执行引擎 - 数据仓库功能:支持数据汇总、查询和分析 - 可扩展性:支持水平扩展,处理能力随集群规模增长
1.1.2 Hive的发展历史
timeline
2007年: Facebook开发Hive项目
2008年: Hive开源并贡献给Apache软件基金会
2010年: Hive成为Apache顶级项目
2011年: 发布Hive 0.7,引入HCatalog
2013年: 发布Hive 0.12,支持Tez执行引擎
2014年: 发布Hive 0.14,引入ACID事务支持
2016年: 发布Hive 2.0,重大架构改进
2018年: 发布Hive 3.0,引入LLAP和Druid集成
2020年: 持续优化,支持更多执行引擎
1.1.3 Hive的设计理念
Schema on Read(读时模式)
传统数据库: Schema on Write
数据写入时 -> 严格验证模式 -> 存储
Hive: Schema on Read
数据存储 -> 读取时应用模式 -> 查询处理
优势:
- 数据加载速度快
- 支持多种数据格式
- 灵活的模式演化
- 适合大数据场景
1.2 Hive架构概览
1.2.1 整体架构图
┌─────────────────────────────────────────────────────────────┐
│ Hive Client │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Hive CLI │ │ Hive Web │ │ JDBC/ODBC │ │
│ │ │ │ Interface │ │ Drivers │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Hive Services │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Driver │ │ Metastore │ │ HiveServer2 │ │
│ │ │ │ Service │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Execution Engines │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ MapReduce │ │ Tez │ │ Spark │ │
│ │ │ │ │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Storage Layer │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ HDFS │ │ Amazon │ │ Other Storage │ │
│ │ │ │ S3 │ │ Systems │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
1.2.2 核心组件详解
1. Hive Client(客户端)
Hive CLI(命令行界面) “`bash
启动Hive CLI
$ hive
执行HiveQL查询
hive> SHOW DATABASES;
hive> USE default;
hive> SHOW TABLES;
**Hive Web Interface(Web界面)**
- 基于浏览器的图形界面
- 支持查询编辑和结果查看
- 提供作业监控功能
**JDBC/ODBC驱动**
java
// Java JDBC连接示例
String url = “jdbc:hive2://localhost:10000/default”;
Connection conn = DriverManager.getConnection(url, “username”, “password”);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(“SELECT * FROM users LIMIT 10”);
“`
2. Hive Services(核心服务)
Driver(驱动器)
- 接收HiveQL查询
- 编译和优化查询
- 生成执行计划
- 协调查询执行
Metastore(元数据存储)
元数据包含:
├── 数据库信息
├── 表结构定义
├── 分区信息
├── 存储位置
├── 序列化信息
└── 统计信息
HiveServer2(服务器)
- 提供Thrift接口
- 支持并发客户端连接
- 处理认证和授权
- 管理会话状态
3. Execution Engines(执行引擎)
MapReduce
优点:
- 成熟稳定
- 容错性强
- 资源管理完善
缺点:
- 启动开销大
- 中间结果写磁盘
- 延迟较高
Tez
优点:
- DAG执行模型
- 内存中处理
- 动态优化
- 更低延迟
适用场景:
- 交互式查询
- 复杂的多阶段作业
Spark
优点:
- 内存计算
- 统一的计算引擎
- 丰富的API
- 机器学习支持
适用场景:
- 迭代计算
- 机器学习
- 流处理
1.3 Hive工作原理
1.3.1 查询执行流程
1. 用户提交HiveQL查询
↓
2. Driver接收查询请求
↓
3. 编译器解析HiveQL
↓
4. 查询优化器优化执行计划
↓
5. 生成物理执行计划
↓
6. 提交作业到执行引擎
↓
7. 执行引擎处理数据
↓
8. 返回查询结果
1.3.2 详细执行步骤
步骤1:语法解析
sql
-- 原始HiveQL
SELECT name, age
FROM users
WHERE age > 25
ORDER BY age;
解析结果:
├── SELECT子句: [name, age]
├── FROM子句: users表
├── WHERE子句: age > 25
└── ORDER BY子句: age ASC
步骤2:语义分析
验证内容:
├── 表是否存在
├── 列是否存在
├── 数据类型是否匹配
├── 权限是否足够
└── 语法是否正确
步骤3:逻辑计划生成
逻辑操作树:
Sort(age)
↓
Filter(age > 25)
↓
Project(name, age)
↓
TableScan(users)
步骤4:物理计划生成
MapReduce作业:
Map阶段:
- 读取users表数据
- 应用过滤条件(age > 25)
- 输出(name, age)对
Reduce阶段:
- 按age排序
- 输出最终结果
1.3.3 元数据管理
Metastore架构
┌─────────────────┐ ┌─────────────────┐
│ Hive Client │ │ Hive Client │
└─────────────────┘ └─────────────────┘
│ │
└───────────┬───────────┘
│
▼
┌─────────────────┐
│ Metastore │
│ Service │
└─────────────────┘
│
▼
┌─────────────────┐
│ Database │
│ (MySQL/Derby) │
└─────────────────┘
元数据表结构
sql
-- 数据库表
CREATE TABLE DBS (
DB_ID BIGINT PRIMARY KEY,
DESC VARCHAR(4000),
DB_LOCATION_URI VARCHAR(4000),
NAME VARCHAR(128),
OWNER_NAME VARCHAR(128),
OWNER_TYPE VARCHAR(10)
);
-- 表信息表
CREATE TABLE TBLS (
TBL_ID BIGINT PRIMARY KEY,
CREATE_TIME INT,
DB_ID BIGINT,
LAST_ACCESS_TIME INT,
OWNER VARCHAR(767),
RETENTION INT,
SD_ID BIGINT,
TBL_NAME VARCHAR(256),
TBL_TYPE VARCHAR(128)
);
-- 列信息表
CREATE TABLE COLUMNS_V2 (
CD_ID BIGINT,
COMMENT VARCHAR(256),
COLUMN_NAME VARCHAR(767),
TYPE_NAME VARCHAR(4000),
INTEGER_IDX INT
);
1.4 Hive数据模型
1.4.1 数据组织层次
Hive数据组织结构:
Database(数据库)
├── Table(表)
│ ├── Partition(分区)
│ │ └── Bucket(分桶)
│ └── Column(列)
└── View(视图)
1.4.2 表类型
1. 内部表(Managed Table)
sql
-- 创建内部表
CREATE TABLE employees (
id INT,
name STRING,
department STRING,
salary DOUBLE
)
STORED AS TEXTFILE;
特点:
- Hive完全管理表的生命周期
- 删除表时,数据和元数据都被删除
- 数据存储在Hive仓库目录中
2. 外部表(External Table)
sql
-- 创建外部表
CREATE EXTERNAL TABLE external_employees (
id INT,
name STRING,
department STRING,
salary DOUBLE
)
STORED AS TEXTFILE
LOCATION '/user/data/employees';
特点:
- Hive只管理元数据
- 删除表时,只删除元数据,数据保留
- 数据可以存储在任意HDFS位置
3. 分区表(Partitioned Table)
sql
-- 创建分区表
CREATE TABLE sales (
product_id INT,
product_name STRING,
price DOUBLE
)
PARTITIONED BY (year INT, month INT)
STORED AS TEXTFILE;
分区结构:
/warehouse/sales/
├── year=2023/month=01/
├── year=2023/month=02/
├── year=2023/month=03/
└── year=2024/month=01/
4. 分桶表(Bucketed Table)
sql
-- 创建分桶表
CREATE TABLE user_behavior (
user_id INT,
action STRING,
timestamp BIGINT
)
CLUSTERED BY (user_id) INTO 32 BUCKETS
STORED AS TEXTFILE;
分桶优势:
- 提高查询性能
- 支持高效的采样
- 优化JOIN操作
1.4.3 数据格式
文本格式
sql
-- TextFile格式
CREATE TABLE text_table (
col1 STRING,
col2 INT
)
STORED AS TEXTFILE;
列式存储格式
sql
-- Parquet格式
CREATE TABLE parquet_table (
col1 STRING,
col2 INT
)
STORED AS PARQUET;
-- ORC格式
CREATE TABLE orc_table (
col1 STRING,
col2 INT
)
STORED AS ORC;
压缩格式
sql
-- 设置压缩
SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
-- 创建压缩表
CREATE TABLE compressed_table (
col1 STRING,
col2 INT
)
STORED AS TEXTFILE
TBLPROPERTIES ('compress'='GZIP');
1.5 Hive在大数据生态中的定位
1.5.1 生态系统集成
大数据生态系统:
┌─────────────────────────────────────────────────────────┐
│ 应用层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ BI工具 │ │ 数据科学 │ │ 报表系统 │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 分析层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ Hive │ │ Spark │ │ Impala │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 存储层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ HDFS │ │ HBase │ │ Kafka │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────┘
1.5.2 与其他工具的比较
Hive vs Spark SQL
Hive:
✓ 成熟稳定
✓ 丰富的功能
✓ 良好的生态支持
✗ 延迟较高
✗ 不支持实时处理
Spark SQL:
✓ 低延迟
✓ 内存计算
✓ 统一的计算引擎
✗ 相对较新
✗ 内存需求大
Hive vs Impala
Hive:
✓ 批处理优化
✓ 复杂查询支持
✓ 多种存储格式
✗ 查询延迟高
Impala:
✓ 低延迟查询
✓ 实时分析
✓ MPP架构
✗ 内存限制
✗ 容错性较弱
1.5.3 适用场景
最适合的场景
1. 数据仓库建设
- 大规模数据存储
- 复杂的ETL处理
- 历史数据分析
2. 批处理分析
- 离线数据处理
- 定期报表生成
- 数据挖掘任务
3. 数据探索
- 临时查询分析
- 数据质量检查
- 业务指标计算
不适合的场景
1. 实时处理
- 毫秒级响应需求
- 流式数据处理
- 在线事务处理
2. 小数据集
- 数据量小于GB级别
- 简单的查询操作
- 频繁的更新操作
3. 高并发查询
- 大量并发用户
- 交互式分析
- 在线服务查询
1.6 Hive的优势与局限性
1.6.1 主要优势
1. 易于使用
sql
-- 熟悉的SQL语法
SELECT department, AVG(salary) as avg_salary
FROM employees
WHERE hire_date >= '2020-01-01'
GROUP BY department
ORDER BY avg_salary DESC;
2. 可扩展性
扩展能力:
├── 水平扩展:增加节点提升处理能力
├── 存储扩展:支持PB级数据存储
├── 计算扩展:支持多种执行引擎
└── 功能扩展:支持UDF和自定义格式
3. 成本效益
成本优势:
├── 开源免费
├── 商用硬件
├── 高存储效率
└── 低运维成本
4. 生态集成
集成能力:
├── Hadoop生态系统
├── BI工具集成
├── 数据科学平台
└── 云平台支持
1.6.2 主要局限性
1. 性能限制
性能问题:
├── 高延迟:不适合实时查询
├── 启动开销:MapReduce作业启动慢
├── 中间结果:频繁的磁盘I/O
└── 小文件问题:影响性能
2. 功能限制
功能限制:
├── 不支持行级更新
├── 不支持实时插入
├── 事务支持有限
└── 索引功能较弱
3. 学习曲线
学习难点:
├── 分布式概念
├── 性能调优
├── 故障排除
└── 最佳实践
1.7 版本演进与新特性
1.7.1 Hive 2.x 主要特性
ACID事务支持
sql
-- 启用事务
SET hive.support.concurrency=true;
SET hive.enforce.bucketing=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
SET hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
SET hive.compactor.initiator.on=true;
SET hive.compactor.worker.threads=1;
-- 创建事务表
CREATE TABLE transactional_table (
id INT,
name STRING,
value DOUBLE
)
CLUSTERED BY (id) INTO 2 BUCKETS
STORED AS ORC
TBLPROPERTIES ('transactional'='true');
-- 支持UPDATE和DELETE
UPDATE transactional_table
SET value = value * 1.1
WHERE id > 100;
DELETE FROM transactional_table
WHERE value < 0;
改进的成本优化器
sql
-- 启用CBO
SET hive.cbo.enable=true;
SET hive.compute.query.using.stats=true;
SET hive.stats.fetch.column.stats=true;
-- 收集统计信息
ANALYZE TABLE sales COMPUTE STATISTICS;
ANALYZE TABLE sales COMPUTE STATISTICS FOR COLUMNS;
1.7.2 Hive 3.x 主要特性
LLAP(Live Long and Process)
LLAP特性:
├── 常驻内存进程
├── 缓存热数据
├── 向量化执行
└── 低延迟查询
性能提升:
├── 查询延迟降低10-100倍
├── 吞吐量提升5-10倍
├── 并发能力增强
└── 资源利用率提高
Druid集成
sql
-- 创建Druid表
CREATE TABLE druid_table
STORED BY 'org.apache.hadoop.hive.druid.DruidStorageHandler'
TBLPROPERTIES (
"druid.datasource" = "sample_datasource",
"druid.query.json" = "{
\"queryType\":\"timeseries\",
\"dataSource\":\"sample_datasource\",
\"granularity\":\"day\",
\"aggregations\":[
{\"type\":\"count\",\"name\":\"count\"}
]
}"
);
物化视图
sql
-- 创建物化视图
CREATE MATERIALIZED VIEW mv_sales_summary
AS
SELECT
product_category,
year,
month,
SUM(sales_amount) as total_sales,
COUNT(*) as transaction_count
FROM sales
GROUP BY product_category, year, month;
-- 自动重写查询使用物化视图
SET hive.materializedview.rewriting=true;
1.8 本章小结
核心概念回顾
1. Hive定位:基于Hadoop的数据仓库软件,提供SQL-like查询能力 2. 架构组件:客户端、核心服务、执行引擎、存储层四层架构 3. 工作原理:HiveQL解析→优化→执行计划→分布式执行 4. 数据模型:数据库→表→分区→分桶的层次结构 5. 生态定位:大数据分析的重要组件,适合批处理场景
技术特色
- SQL兼容性:降低学习成本,便于数据分析师使用 - 可扩展性:支持PB级数据处理和水平扩展 - 灵活性:支持多种数据格式和存储系统 - 成熟度:经过多年发展,功能完善,生态丰富 - 成本效益:开源免费,运行在商用硬件上
适用场景
- ✅ 数据仓库建设:大规模数据存储和管理 - ✅ 批处理分析:离线数据处理和报表生成 - ✅ 数据探索:临时查询和数据挖掘 - ❌ 实时处理:毫秒级响应和流式处理 - ❌ OLTP系统:频繁更新和事务处理 - ❌ 小数据集:GB级别以下的数据处理
下一章预告
下一章我们将学习《环境搭建与安装配置》,包括: - Hadoop环境准备 - Hive安装配置 - 元数据库设置 - 性能参数调优 - 集群部署方案 通过实际操作,您将能够搭建一个完整的Hive开发和生产环境。 —
练习题
理论题
1. 概念理解 - 解释Hive的”Schema on Read”设计理念及其优势 - 比较内部表和外部表的区别和适用场景 - 说明Hive在大数据生态系统中的定位和作用 2. 架构分析 - 描述Hive查询的完整执行流程 - 解释Metastore的作用和重要性 - 比较不同执行引擎(MapReduce、Tez、Spark)的特点 3. 应用场景 - 列举Hive适合和不适合的应用场景 - 分析在什么情况下选择Hive而不是其他大数据工具 - 设计一个基于Hive的数据仓库架构方案
思考题
1. 技术选型 - 如果要构建一个电商数据分析平台,如何评估是否使用Hive? - 在混合云环境中,如何设计Hive的部署架构? - 如何平衡查询性能和存储成本? 2. 发展趋势 - 分析Hive 3.x的新特性对实际应用的影响 - 预测Hive在云原生环境中的发展方向 - 讨论Hive与实时计算引擎的融合趋势 — 参考资料: - Apache Hive官方文档 - Hive架构设计文档 - 《Programming Hive》- Edward Capriolo