hive表锁只在涉及并发操作的时候才能遇到
1. 报错情况
-- 报错提示:
FAILED: Error in acquiring locks: Locks on the underlying objects cannot be acquired. retry after some time
-- 解决办法:关闭并发
set hive.support.concurrency=false;
-- 设置是否开启并发模式, 默认该参数没有被定义
set hive.support.concurrency=false;
2. hive表锁介绍
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 | load data (local) inpath ’ ’ into table T partition§ | X on T.P | 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 本地路径 hdfs路径 不触发锁。 可以用在shell上 执行 hadoop dfs -put 本地路径 hdfs路径 代替 load data,避免锁问题 load data 时若分区不存在会创建分区,而hadoop dfs -put不会, 需先调用alter table add partition来创建分区。 若一个操作正在读取表中数据,这时向表的分区中put数据,该数据在本次读时不会被加载,下次读操作时才会被加载。
3. 查看锁命令
- SHOW LOCKS <TABLE_NAME>;
- SHOW LOCKS <TABLE_NAME> extended;
- SHOW LOCKS <TABLE_NAME> PARTITION (<PARTITION_DESC>);
- SHOW LOCKS <TABLE_NAME> PARTITION (<PARTITION_DESC>) extended;
欢迎大家留言一起讨论学习!
|