Hive ACID事务与事务表
请说明Hive ACID事务的支持情况,包括INSERT/UPDATE/DELETE的实现原理,以及事务表(Transactional Table)的配置要求。
回答
我是大山
Hive ACID事务(Hive 3.x+成熟):
实现原理:
Hive基于行级增量存储(Delta Files)+ Compaction实现ACID:
-
写入Delta文件:
- UPDATE/DELETE不修改原文件,而是写入增量文件
- INSERT写入Base文件或Delta文件
- 每个事务生成一组Delta文件(
delta_xxx或delete_delta_xxx)
-
事务ID:每个事务有全局唯一的Write ID
-
读取合并:查询时读取Base文件 + 所有Delta文件合并,按操作类型和事务ID过滤
-
Compaction:
- Minor Compaction:合并多个Delta文件为一个Delta
- Major Compaction:将Base+Delta合并为新Base
配置要求:
SET hive.support.concurrency=true;
SET hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
SET hive.compactor.initiator.on=true; -- 启动自动Compaction
SET hive.compactor.worker.threads=5; -- Compaction线程数
建表:
CREATE TABLE txn_table (id INT, name STRING)
CLUSTERED BY (id) INTO 10 BUCKETS -- 必须分桶
STORED AS ORC -- 必须ORC
TBLPROPERTIES ('transactional'='true');
限制:
- 必须ORC格式、必须分桶
- 不支持
LOAD DATA,必须用INSERT - 不支持外部表
- 不适合高频OLTP场景(推荐<100TPS)
适用: 缓慢变化的维度表、需要更新/删除的离线表。