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
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也是可以的)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章