CodeWalk

Hive ACID事务与事务表

作者:我是大山 · 2026-05-30 12:55

请说明Hive ACID事务的支持情况,包括INSERT/UPDATE/DELETE的实现原理,以及事务表(Transactional Table)的配置要求。

回答

我是大山

Hive ACID事务(Hive 3.x+成熟):

实现原理:

Hive基于行级增量存储(Delta Files)+ Compaction实现ACID:

  1. 写入Delta文件

    • UPDATE/DELETE不修改原文件,而是写入增量文件
    • INSERT写入Base文件或Delta文件
    • 每个事务生成一组Delta文件(delta_xxxdelete_delta_xxx
  2. 事务ID:每个事务有全局唯一的Write ID

  3. 读取合并:查询时读取Base文件 + 所有Delta文件合并,按操作类型和事务ID过滤

  4. 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)

适用: 缓慢变化的维度表、需要更新/删除的离线表。