在开启锁之前,需要开启zookeeper:zkServer.sh start。
开启了以后,要在hive中设置两个属性:
set hive.zookeeper.quorum=zk1,zk2,zk3;
set hive.support.concurrency=true;(默认为false)
配置好以后,hive会对特定的 查询自动开启获取锁。
show locks:查看所有的锁 。
hive存在两种锁,共享锁Shared(S)和排它锁Exclusive(X),
其中只触发s锁的操作可以并发的执行,只要有一个操作对表或者分区出发了x锁,则该表或者分区不能并发的执行作业。
各个操作锁出发的锁如下:
Hive Command | Locks Acquired |
select .. T1 partition P1 | S on T1, T1.P1 |
insert into T2(partition P2) select .. T1 partition P1 | S on T2, T1, T1.P1 and X on T2.P2 |
insert into T2(partition P.Q) select .. T1 partition P1 | S on T2, T2.P, T1, T1.P1 and X on T2.P.Q |
alter table T1 rename T2 | X on T1 |
alter table T1 add cols | X on T1 |
alter table T1 replace cols | X on T1 |
alter table T1 change cols | X on T1 |
alter table T1 add partition P1 | S on T1, X on T1.P1 |
alter table T1 drop partition P1 | S on T1, X on T1.P1 |
alter table T1 touch partition P1 | S on T1, X on T1.P1 |
*alter table T1 set serdeproperties * | S on T1 |
*alter table T1 set serializer * | S on T1 |
*alter table T1 set file format * | S on T1 |
*alter table T1 set tblproperties * | X on T1 |
drop table T1 | X on T1 |
直接在hadoop上 hadoop dfs -put xx yy 不触发锁。(可以用在shell上 执行 hadoopdfs -put file hdfsmulu 这两天命令来代替 load data,避免锁)
load data 时若分区不存在会创建分区,而hadoop dfs -put不会, 需先调用alter table addpartition来创建分区。若一个操作正在读取表中数据,这时向表的分区中put数据,该数据在本次读时不会被加载,下次读操作时才会被加载。
查看锁命令:
- SHOW LOCKS <TABLE_NAME>;
- SHOW LOCKS <TABLE_NAME>extended;
- SHOW LOCKS <TABLE_NAME> PARTITION(<PARTITION_DESC>);
- SHOW LOCKS <TABLE_NAME> PARTITION(<PARTITION_DESC>) extended;
对于不存在的分区,当表正在读时,利用load data不能向新分区中导入数据,而采用alter table add partition 加上put的方式可以向其中导入数据(个人理解loaddata partition在完成后才会触发更新元数据的操作,而在其未完成之前时需要load 数据的由于该表的所以分区已经被加了s锁,故不能执行。而alter table add partition该分区是新创建出来的,其它的操作未对其执行加锁操作,把第二步put换为loaddata也是可以的)