限制条件:
- 所有DML操作都是自动提交,尚不支持BEGIN,COMMIT,和ROLLBACK,计划在将来的版本中支持这些特性。
- 在第一个版本中只支持ORC文件格式。构建事务特性的初衷是可以使用任何存储格式,只要这些存储格式可以确定如何更新或删除基本记录(基本上,具有显式或隐式的行id即可),但到目前为止,仅完成针对ORC的集成工作。
- 默认情况下,事务被配置为OFF。有关配置值的讨论,请参见下面的配置部分。
- 要使用事务特性,表必须分桶。在同一系统中的不使用事务和ACID的表则无需分桶。外部表不能成为ACID表,因为外部表上的更改超出了紧缩器的控制范围(hive-13175)。
- 不允许从非ACID的会话中读取/写入ACID表。换句话说,要操作ACID表,必须将Hive事务管理器设置为org.apache.hadoop.hive.ql.lockmgr.DbTxnManager。
- 现在只支持快照隔离级别。当一个给定的查询启动时,它会提供该数据的一致快照。不支持脏读(READ UNCIMMITTED)、提交读(READ COMMITTED)、可重复读(REPEATABLE READ)或可序列化(SERIALIZABLE)。引入BEGIN的目的是在事务持续时间内支持快照隔离,而不仅仅是一个查询。根据用户请求,还可以添加其他隔离级别。
- 现有的ZooKeeper和内存锁管理器与事务不兼容。
- 原来ACID表不支持使用ALTER TABLE更改Schema,参见Hive-11421。
- 使用Oracle作为Metastore DB和“datanucleus.connectionPoolingType = BONECP”时,可能偶发性产生 “No such lock ...”和“No such transaction...”的错误。在这种情况下,建议设置“datanucleus.connectionPoolingType = DBCP”。
- LOAD DATA ...语句不支持事务性表,直到Hive-16732才能正确执行。
1.1设置参数
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;
1.2创建表时指定开启事务
create table emp_trans (
emp_id int,
name string
) clustered by (emp_id) into 2 buckets
row format delimited
fields terminated by '\t'
collection items terminated by '-'
map keys terminated by ':'
stored as orc
tblproperties ('transactional'='true');