hive写mysql事物_hive如何配置支持事务及insert、update、delete

Hive从0.14版本开始支持事务和行级更新,但缺省是不支持的,需要一些附加的配置。要想支持行级insert、update、delete,需要配置Hive支持事务。

一、Hive具有ACID语义事务的使用场景

1. 流式接收数据。

许多用户使用诸如Apache Flume、Apache Storm或Apache Kafka这样的工具将流数据灌入Hadoop集群。当这些工具以每秒数百行的频率写入时,Hive也许只能每15分钟到1小时添加一个分区,因为过于频繁地添加分区很快就会使一个表中的分区数量难以维护。而且这些工具还可能向已存在的分区中写数据,但是这样将会产生脏读(可能读到查询开始时间点以后写入的数据),还在这些分区的所在目录中遗留大量小文件,进而给NameNode造成压力。在这个使用场景下,事务支持可以获得数据的一致性视图同时避免产生过多的文件。

2. 缓慢变化维。

在一个典型的星型模式数据仓库中,维度表随时间的变化很缓慢。例如,一个零售商开了一家新商店,需要将新店数据加到商店表,或者一个已有商店的营业面积或其它需要跟踪的特性改变了。这些改变会导致插入或修改个别记录。从0.14版本开始,Hive支持行级更新。

3. 数据重述。

有时发现数据集合有错误并需要更正。或者当前数据只是个近似值(如只有全部数据的90%,得到全部数据会滞后)。或者业务业务规则可能需要根据后续事务重述特定事务(打个比方,一个客户购买了一些商品后又购买了一个会员资格,此时可以享受折扣价格,包括先前购买的商品)。或者一个客户可能按照合同在终止了合作关系后要求删除他们的客户数据。从Hive 0.14开始,这些使用场景可以通过INSERT、UPDATE和DELETE支持。

二、配置Hive支持事务(Hive 2.0版)

1. 在hive-site.xml文件中添加如下配置项

[XML] 纯文本查看 复制代码

2. 添加Hive元数据(使用mysql存储)

[SQL] 纯文本查看 复制代码

说明:初始时这三个表没有数据,如果不添加数据,会报以下错误:

org.apache.hadoop.hive.ql.lockmgr.DbTxnManager FAILED: Error in acquiring locks: Error communicating with the metastore

三、测试

1. 启动hadoop集群和mysql

[Bash shell] 纯文本查看 复制代码

2. 建立测试表

[Bash shell] 纯文本查看 复制代码

说明:建表语句必须带有into buckets子句和stored as orc TBLPROPERTIES ('transactional'='true')子句,并且不能带有sorted by子句。

3. 测试insert、update、delete

[SQL] 纯文本查看 复制代码

执行结果分别如图1-3所示。

7ce461cd7c7b8d96e24310040aad80ec.png 

图1

e4dc77e0742aea980df10b8bae5131db.png 

图2

d64a19e286568a0d5119840e901cdc6a.png 

图3

说明:不能修改bucket列的值,否则会报以下错误:

FAILED: SemanticException [Error 10302]: Updating values of bucketing columns is not supported.  Column id.

4. 已有非ORC表的转换

-- 在本地文件/home/grid/a.txt中写入以下4行数据

1,张三,US,CA

2,李四,US,CB

3,王五,CA,BB

4,赵六,CA,BC

[SQL] 纯文本查看 复制代码

修改前和修改后的数据分别如图4、图5所示。

54cf8cf90c62e0b1dacb778a7bec65f1.png 

图4

a614a1f034f9caa1606ff9837898d634.png 

图5

说明:不能update分区键,否则会报以下错误:

FAILED: SemanticException [Error 10292]: Updating values of partition columns is not supported

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值