Hive 事物表

Hive Transactional Tables 事务表

Hive 事务背景知识

Hive 本身从设计之初时,就是不支持事务的,因为Hive的核心目标是将已经存在的结构化数据文件映射成为表,然后提供基于表的SQL分析处理,是一款面向分析的工具。且映射的数据通常存储于HDFS上,而HDFS是不支持随机修改文件数据的。

这个定位就意味着在早期的 Hive 的 SQL 语法中是没有 update,delete 操作的,也就没有所谓的事务支持了,因为都是 select 查询分析操作。

从 Hive0.14 版本开始,具有 ACID 语义的事务已添加到 Hive 中,以解决以下场景下遇到的问题:

  • 流式传输数据。使用如 Apache Flume 或 Apache Kafka 之类的工具将数据流式传输到 Hadoop 集群中。虽然这些工具可以每秒数百行或更多行的速度写入数据,但是 Hive 只能每隔 15 分钟到一个小时添加一次分区。频繁添加分区会很快导致表中大量的分区。
    因此通常使用这些工具将数据流式传输到现有分区中,但是这会使读者感到脏读(也就是说,他们将在开始查询后看到写入的数据),并将许多小文件留在目录中,这将给 NameNode 带来压力。通过事务功能,同时允许读者获得一致的数据视图并避免过多的文件。

  • 尺寸变化缓慢。在典型的星型模式数据仓库中,维度表随时间缓慢变化。例如,零售商将开设新商店,需要将其添加到商店表中,或者现有商店可能会更改其平方英尺或某些其他跟踪的特征。这些更改导致插入单个记录或更新 记录(取决于所选策略)。

  • 数据重述。有时发现收集的数据不正确,需要更正。从 Hive 0.14 开始,可以通过 INSERT,UPDATE 和 DELETE 支持这些用例。

Hive事务表局限性

虽然 Hive 支持了具有 ACID 语义的事务,但是在使用起来,并没有像在 MySQL 中使用那样方便,有很多局限性。原因很简单,毕竟 Hive 的设计目标不是为了支持事务操作,而是支持分析操作,且最终基于 HDFS 的底层存储机制使得文件的增加删除修改操作需要动一些小心思。具体限制如下:

  • 尚不支持 BEGINCOMMITROLLBACK。所有语言操作都是自动提交的。
  • 仅支持 ORC文件格式(STORED AS ORC)
  • 默认情况下事务配置为关闭。需要 配置参数开启 使用。
  • 表必须是 分桶表(Bucketed) 才可以使用事务功能。
  • 表参数 transactional 必须为 true
  • 外部表不能成为 ACID 表,不允许从非 ACID 会话读取/写入 ACID 表。

案例:创建使用 Hive 事务表

如果不做任何配置修改,直接针对 Hive 中已有的表进行 Update、Delete、Insert 操作,可以发现,只有 Insert 语句可以执行,Update 和 Delete 操作会报错。

如何在 Hive 中配置开启事务表,并且进行操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
--Hive中事务表的创建使用
--1、开启事务配置(可以使用set设置当前session生效 也可以配置在hive-site.xml中)
set hive.support.concurrency = true; --Hive是否支持并发
set hive.enforce.bucketing = true; --从Hive2.0开始不再需要 是否开启分桶功能
set hive.exec.dynamic.partition.mode = nonstrict; --动态分区模式 非严格
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; --
set hive.compactor.initiator.on = true; --是否在Metastore实例上运行启动线程和清理线程
set hive.compactor.worker.threads = 1; --在此metastore实例上运行多少个压缩程序工作线程。

--2、创建Hive事务表
create table trans_student(
id int,
name String,
age int
)clustered by (id) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');

--3、针对事务表进行insert update delete操作
insert into trans_student (id, name, age)
values (1,"allen",18);

update trans_student
set age = 20
where id = 1;

delete from trans_student where id =1;

select *
from trans_student;

Hive 事物表
https://flepeng.github.io/045-Hive-21-命令-Hive-事物表/
作者
Lepeng
发布于
2025年1月21日
许可协议