在很长一段时间里,Hive 因其基于 HDFS 的“一次写入、多次读取”的设计,被认为是不支持事务的,主要适用于大规模的批处理 ETL 任务和离线数据分析(OLAP),而不是在线事务处理(OLTP)。
然而,随着企业需求的演进,需要在 Hive 上实现数据更新、删除以及更精确的读取一致性等场景越来越多(例如:满足 GDPR 的“被遗忘权”、数据去重、缓慢变化维 SCD 等)。因此,从 Hive 0.14 版本开始,Hive 正式引入了对事务的支持。
核心概念
Hive 的事务实现并非像传统关系型数据库(如 MySQL)那样通过锁和回滚日志来实现,而是采用了基于底层存储(HDFS)特性的方案。
-
ACID 特性:
- 原子性 (Atomicity): 一个事务内的所有操作,要么全部完成,要么全部不完成。Hive 通过事务管理器和一个基于写时复制(Copy-On-Write)的 Delta 文件目录结构来保证。
- 一致性 (Consistency): 事务必须使数据库从一个一致性状态变换到另一个一致性状态。这通常由 Hive 本身和应用层共同保证。
- 隔离性 (Isolation): 多个事务并发执行时,一个事务的执行不应影响其他事务。Hive 最初只支持
READ UNCOMMITTED级别,但现在支持READ COMMITTED和SNAPSHOT ISOLATION(通过INSERT语句实现的是快照隔离,通过UPDATE/DELETE实现的是读已提交)。 - 持久性 (Durability): 事务完成后,它对数据库的修改是永久性的。Hive 通过将数据写入 HDFS 来保证,因为 HDFS 本身具有数据持久化和多副本的特性。
-
事务表 (Transactional Tables):
- 并非所有 Hive 表都支持事务。必须将表显式地创建为事务表。
- 事务表必须是分桶表 (Bucketed Table)。分桶是 Hive 事务实现的基础,因为它能将操作锁定在特定的桶内,提高并发效率。
-
底层实现原理 (基于 Delta 文件):
- 写时复制 (Copy-On-Write): 这是 Hive 事务的核心思想。当对表进行
UPDATE或DELETE操作时,Hive 不会直接修改原始数据文件。 - Delta 文件: 所有的增、删、改操作都会生成新的小文件,称为
delta文件(存放增量数据)和delete_delta文件(存放删除操作的数据)。- 例如,一个
INSERT操作会生成一个delta_0000001_0000001_0000文件。 - 一个
DELETE操作会生成一个delete_delta_0000002_0000002_0000文件。
- 例如,一个
- 压缩 (Compaction):
- 次要压缩 (Minor Compaction): 将多个小的 Delta 文件合并成一个更大的 Delta 文件,由 Hive Metastore 中的线程自动触发。
- 主要压缩 (Major Compaction): 将所有的 Delta 文件与原始的基础文件(Base files)合并,生成新的基础文件,并删除旧的 Delta 文件。这本质上是一个重写数据的过程,可以显著提升读取性能。
- 读取过程: 当执行一个
SELECT查询时,Hive 会打开所有相关的基础文件和 Delta 文件,根据事务 ID 应用所有的增删改操作,最终将结果合并后返回给用户。这个过程对用户是透明的。
- 写时复制 (Copy-On-Write): 这是 Hive 事务的核心思想。当对表进行
如何使用 Hive 事务
1. 配置 Hive 以支持事务
首先,必须在 hive-site.xml 中进行必要的配置:
<property

最低0.47元/天 解锁文章
9314

被折叠的 条评论
为什么被折叠?



