您的足迹:首页 > Hive >开启hive事务注意事项

开启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事务的开启步骤

在hive-site.xml中设置以下配置或者在命令行执行以下命令

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事务注意事项

相关推荐


  • blogger

发表评论

路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交

网友评论(0)