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 |
補充一條,load data (local) inpath ' ' into table xx partition() 出發的鎖操作同insert
直接在hadoop上 hadoop dfs -put xx yy 不觸發鎖。(可以用在shell上 執行 hadoop dfs -put file hdfsmulu 這兩天命令來代替 load data,避免鎖)
load data 時若分區不存在會創建分區,而hadoop dfs -put不會, 需先調用alter table add partition來創建分區。 若一個操作正在讀取表中數據,這時向表的分區中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的方式可以向其中導入數據(個人理解load data
partition在完成後纔會觸發更新元數據的操作,而在其未完成之前時需要load 數據的 由於該表的所以分區已經被加了s鎖,故不能執行。而alter table add partition 該分區是新創建出來的,其它的操作未對其執行加鎖操作,把第二步put換爲load data也是可以的)