hive事务讲解

hive事务讲解

hive0.14版本之后,开始支持事务。hive中事务的引入,使Hive支持行级别的ACID,读操作与写操作不会冲突。

hive事务的限制条件

1.在现在的版本中,只支持ORC文件格式。
2.默认情况下,hive的事务性是关闭的,开启需要设置transactional=true。
3.表必须是Bucket表。
4.外部表不能成为ACID表,因为外部表的变化,不能被Compact控制。
5.不能从一个非ACID会话向ACID表中读写数据。这意味着Hive事务管理必须设置成org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
6.目前只支持快照级别的隔离,不支持脏读,重复读等。
7.存在的Zookeeper和内存锁管理机制与事务是不兼容的

Hive事务的开启步骤

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;

Hive支持CRUD原理:

Hive的ORC格式文件,有base files和delta files。
base files是基础文件,delta files是增删改操作生成的新文件。
当进行ACID操作的时候,base files 和 delta files会发生变化,
满足一定条件后,这两类文件会进行合并,产生新的base files。

文件的合并,由下面两个参数决定

hive.compactor.check.interval
检查表或者分区是否需要compact的时间间隔,秒为单位,默认300秒。
检查的方式是,向Namenode发送请求,查看相应的表或者分区是否发生事务操作。

hive.compactor.max.num.delta
compactor尝试在一个job中处理的最多的Delta文件个数
Compaction不支持并发的读写数据,在Compaction之后,系统会等所有对老文件的读完成之后,才删除老文件

事务管理

对hive表进行更新的时候,管理事务是很重要的一个部分。
metastore会跟踪正在进行的读和写事务。
为了提供一个持续性的视图来进行读操作,metastore会对每一个写操作创建一个事务ID。
事务ID,在一个metastore中是从1严格增长的。
在内部,事务是通过Hive Metastore管理的。
具体修改操作是通过ORC API执行到HDFS上面的,绕开了Metastore。

当一个读操作开始的时候,metastore会提供读的表,和当前已经提交的事务ids集合。这些集合由最大提交事务id和还在进行中的事务id。
当进行查询操作的时候,会启动MR任务,相同的集合会通过jobconf提供给MR任务,因此,读操作看到的是,命令开始那一刻,表的一个连续的snapshot视图。

写操作,metastore会提供正在被读的表和正在被写的表的列表,获取到一个可以读取的有效事务id集合,和写事务id。所有的写入数据,都会打上写事务id标签。

在上面两种情况,当命令完成的时候,它应该通知metastore。metastore一定要确认或者放弃被抛弃的事务,hive客户端一定要每十分钟通知metastore一次,说明命令还在运行,否则的话,这个事务会被放弃。metastore会维护着被读的表集合和相应的事务id,这样它可以在上次读操作完成后,调度合并完数据的删除。

在一个写事务被提交到metastore之前,所有的那个事务的HDFS文件必须在它们的最终位置。
同时,在一个写事务被放弃之前,所有的文件必须从HDFS上面删除了。
这能保证,给reader的任何有效的事务id都只有正确的HDFS文件与它关联。

参考文档 https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions

你可能感兴趣的:(Hive)