Hive 使用orc进行事务操作(update)

需求背景

需求方需要用Hive来进行一些update操作。以往一般用Parquet这种格式作为Hive的存储格式,查文档得知Parquet不支持
update,orc格式可以支持update。

开始试验

创建测试数据

首先我们在Hive上简单地创建一个表作为测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
create table test_format (
car_name string,
series string,
e_series string,
model string,
variant string
) clustered by (car_name) into 5 buckets stored as orc TBLPROPERTIES('transactional'='true');
insert into test_format values
('2017款宝马3系320i M运动型','3','F30','320i','320i M Sport Package'),
('2018款宝马3系320i M运动套装','3','F30','320i','320i M Sport Package'),
('2018款宝马3系320i M运动曜夜版','3','F30','320i','320i M Sport Dark Edition'),
('2019款宝马3系320i M 运动套装','3','F30','320i','320i M Sport Package');

刚开始会有报错:

1
This command is not allowed on an ACID table auto_projects.test_format with a non-ACID transaction manager. Failed command: insert into test_format value

这是因为有些配置文件需要修改才能支持transaction操作。

在hive-site.xml里面添加如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<property>
<name>hive.optimize.sort.dynamic.partition</name>
<value>false</value>
</property>
<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>1</value>
</property>
<property>
<name>hive.in.test</name>
<value>true</value>
</property>

Cloudera Manager的话则可以在WebUI上完成。

  1. 在WebUI上先点击Hive集群。
  2. 点击配置,然后找到一个叫hive-site.xml 的 HiveServer2 高级配置代码段(安全阀)的tag中
  3. 将上述配置内容复制在文本框内。
  4. 重启集群

测试更新数据

测试更新和删除部分数据

1
2
3
update test_format set model='test' where series='3';
delete from test_format where model='test';

这里需要注意的一个地方就是 要更新的字段不能是设置为bucket的那个字段,不然会报错:

成功执行!

踩的一些坑

因为我是用的单节点部署的CDH集群。刚开始,在Hive上执行select count(*) ; 和 insert操作时候,没有任何报错,
但会一直卡在那里。后来查看到cloudera community说单节点要改个mapred-site.xml的一个参数:
mapreduce.framework.name

默认是用的yarn,单机的话要改为local,然后重启集群insert 和 select count(*) 就不会卡住了,
CDH也是在WebUI上的Yarn集群上的配置上修改。

Reference

https://www.cnblogs.com/qifengle-2446/p/6424620.html
https://community.cloudera.com/t5/Batch-SQL-Apache-Hive/Hive-server-query-hanging-when-issue-ing-select-count-on-CLI/m-p/67119#M2662