大数据开发之Hive篇16-Hive的事务介绍

备注:
Hive 版本 2.1.1

一.Hive事务简介

1.1 为什么要支持ACID

事务的四个属性:
1.原子性(Atomic)(Atomicity)
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。
2.一致性(Consistent)(Consistency)
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。某些维护一致性的责任由应用程序开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束。例如,当开发用于转帐的应用程序时,应避免在转帐过程中任意移动小数点。
3.隔离性(Insulation)(Isolation)
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为隔离性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时将获得最高的隔离级别。在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。
4.持久性(Duration)(Durability)
事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。

直到Hive 0.13,原子性、一致性和持久性都是在分区级别上提供的。隔离可以通过打开其中一个可用的锁定机制(ZooKeeper或内存)来提供。随着Hive 0.13中事务的增加,现在可以在行级别提供完整的ACID语义,这样一个应用程序可以添加行,而另一个应用程序可以从同一个分区读取,而不会相互干扰。

Hive中添加了带有ACID语义的事务,以解决以下问题:

数据流的摄取。许多用户使用Apache Flume、Apache Storm或Apache Kafka等工具将数据流导入Hadoop集群。这些工具可以以每秒数百行或更多的速度写入数据,而Hive只能每15分钟到1小时增加一个分区。更频繁地添加分区会很快导致表中出现大量分区。这些工具可以将数据流到现有的分区中,但这会导致读取器脏读(也就是说,他们会在开始查询之后看到写入的数据),并在他们的目录中留下许多小文件,这会给NameNode带来压力。有了这个新功能,将支持这个用例,同时允许读者获得一致的数据视图,并避免过多的文件。

缓慢变化维度。在典型的星型模式数据仓库中,维度表会随着时间缓慢更改。例如,零售商将开设新的商店,这些商店需要添加到stores表中,或者现有的商店可能会更改其面积或其他一些可跟踪的特征。这些更改将导致插入单个记录或更新记录(取决于所选择的策略)。从0.14开始,Hive就能够支持这个功能。

数据重述。有时收集的数据被发现是不正确的,需要纠正。或者第一个数据实例可能是一个近似值(90%的服务器报告),稍后提供完整的数据。或者业务规则可能要求由于后续交易而重新申明某些交易(例如,在购买之后,客户可能会购买会员资格,因此有权享受折扣价格,包括之前的购买)。或者,根据合同,用户可能被要求在客户关系终止时删除他们的数据。从Hive 0.14开始,这些用例可以通过插入、更新和删除来支持。

使用SQL MERGE语句进行批量更新。

1.2 hive事务的限制

还不支持BEGIN、COMMIT和ROLLBACK。所有语言操作都是自动提交的。未来版本可能会支持这个功能。

第一个版本只支持ORC文件格式。已经构建了这样的特性,即任何可以确定如何将更新或删除应用于基本记录(基本上,具有显式或隐式行id)的存储格式都可以使用事务,但到目前为止,集成工作仅针对ORC完成。

默认情况下,事务被配置为off。如需要开启,需要调整hive参数。

为了使用这些特性,表必须被封装起来。同一个系统中不使用事务和ACID的表不需要进行存储。不能将外部表创建为ACID表,因为外部表上的更改超出了压缩器的控制范围。

不允许从非ACID会话读写ACID表。换句话说,Hive事务管理器必须设置为org.apache.hadoop.hive.ql.lockmgr.DbTxnManager来处理ACID表。

目前只支持快照级别隔离。当一个给定的查询开始时,将为它提供一个一致的数据快照。不支持脏读、读提交、可重复读或可序列化。引入BEGIN的目的是支持事务期间的快照隔离,而不仅仅是单个查询。可以根据用户请求添加其他隔离级别。

现有的ZooKeeper和内存锁管理器与事务不兼容。

使用Oracle作为Metastore DB和“datanucleus.connectionPoolingType=BONECP" 可能会产生间歇性的"“No such lock…” and “No such transaction…” 错误。在这种情况下,建议使用connectionPoolingType=DBCP"。

load data 事务表不支持事务表。

二.Hive 事务表测试

2.1 修改配置文件

vim hive-site.xml
<property>
    <name>hive.support.concurrency</name>
    <value>true</value>
  </property>

<property>
    <name>hive.enforce.bucketing</name>
    <value>true</value>
  </property>

<property>
    <name>hive.exec.dynamic.partition.mode</name>
    <value>nonstrict</value>
  </property>

<property>
    <name>hive.txn.manager</name>
    <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
  </property>

<property>
    <name>hive.compactor.initiator.on</name>
    <value>true</value>
  </property>

<property>
    <name>hive.compactor.worker.threads</name>
    <value>2</value>
  </property>

2.2 重启hive服务

通过CDH管理界面重启hive服务

2.3 验证acid

代码

CREATE TABLE test_transaction(id int, name string) CLUSTERED BY (id) INTO 2 BUCKETS
STORED AS ORC TBLPROPERTIES ('transactional'='true');

INSERT INTO test_transaction VALUES (1, 'John') ,(2,'Lily'),(3, 'Tom');
UPDATE test_transaction SET name='Richard' WHERE id=2;
DELETE FROM test_transaction WHERE id=3;

测试记录

hive> CREATE TABLE test_transaction(id int, name string) CLUSTERED BY (id) INTO 2 BUCKETS
    > STORED AS ORC TBLPROPERTIES ('transactional'='true');
OK
Time taken: 1.661 seconds
hive> INSERT INTO test_transaction VALUES (1, 'John') ,(2,'Lily'),(3, 'Tom');
Query ID = root_20201224175758_cc903192-1091-4893-8f0c-a1448a1c737b
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 2
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
20/12/24 17:57:59 INFO client.ConfiguredRMFailoverProxyProvider: Failing over to rm69
Starting Job = job_1608780340033_0008, Tracking URL = http://hp3:8088/proxy/application_1608780340033_0008/
Kill Command = /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hadoop/bin/hadoop job  -kill job_1608780340033_0008
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 2
2020-12-24 17:58:07,399 Stage-1 map = 0%,  reduce = 0%
2020-12-24 17:58:13,627 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 2.94 sec
2020-12-24 17:58:19,822 Stage-1 map = 100%,  reduce = 50%, Cumulative CPU 6.65 sec
2020-12-24 17:58:20,852 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 10.26 sec
MapReduce Total cumulative CPU time: 10 seconds 260 msec
Ended Job = job_1608780340033_0008
Loading data to table test.test_transaction
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 1  Reduce: 2   Cumulative CPU: 10.26 sec   HDFS Read: 12284 HDFS Write: 1438 HDFS EC Read: 0 SUCCESS
Total MapReduce CPU Time Spent: 10 seconds 260 msec
OK
Time taken: 24.358 seconds
hive> UPDATE test_transaction SET name='Richard'WHERE id=2;
Query ID = root_20201224175824_91acdbe9-5966-489c-beab-67b374fc6911
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 2
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
20/12/24 17:58:25 INFO client.ConfiguredRMFailoverProxyProvider: Failing over to rm69
Starting Job = job_1608780340033_0009, Tracking URL = http://hp3:8088/proxy/application_1608780340033_0009/
Kill Command = /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hadoop/bin/hadoop job  -kill job_1608780340033_0009
Hadoop job information for Stage-1: number of mappers: 2; number of reducers: 2
2020-12-24 17:58:32,217 Stage-1 map = 0%,  reduce = 0%
2020-12-24 17:58:39,426 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 7.1 sec
2020-12-24 17:58:45,616 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 11.71 sec
MapReduce Total cumulative CPU time: 11 seconds 710 msec
Ended Job = job_1608780340033_0009
Loading data to table test.test_transaction
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 2  Reduce: 2   Cumulative CPU: 11.71 sec   HDFS Read: 21436 HDFS Write: 770 HDFS EC Read: 0 SUCCESS
Total MapReduce CPU Time Spent: 11 seconds 710 msec
OK
Time taken: 23.475 seconds
hive> 
    > DELETE FROM test_transaction WHERE id=3;
Query ID = root_20201224175855_61fa8aaa-9db7-4f8d-87e9-31a0b4da835b
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 2
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
20/12/24 17:58:55 INFO client.ConfiguredRMFailoverProxyProvider: Failing over to rm69
Starting Job = job_1608780340033_0010, Tracking URL = http://hp3:8088/proxy/application_1608780340033_0010/
Kill Command = /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hadoop/bin/hadoop job  -kill job_1608780340033_0010
Hadoop job information for Stage-1: number of mappers: 2; number of reducers: 2
2020-12-24 17:59:01,750 Stage-1 map = 0%,  reduce = 0%
2020-12-24 17:59:09,985 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 7.04 sec
2020-12-24 17:59:16,140 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 11.83 sec
MapReduce Total cumulative CPU time: 11 seconds 830 msec
Ended Job = job_1608780340033_0010
Loading data to table test.test_transaction
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 2  Reduce: 2   Cumulative CPU: 11.83 sec   HDFS Read: 21690 HDFS Write: 641 HDFS EC Read: 0 SUCCESS
Total MapReduce CPU Time Spent: 11 seconds 830 msec
OK
Time taken: 22.25 seconds
hive> 

参考

1.https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions

猜你喜欢

转载自blog.csdn.net/u010520724/article/details/112462004