完全理解Hive中的鎖

前面遇到過一次由於Hive中表被鎖住了,致使定時任務一直失敗。這兩天又出現了表被鎖,緣由是鏈接hiveserver2過於頻繁,mysql鏈接被打滿,引起的連鎖反應,致使咱們的小時任務一直失敗,下午重點注意到這個問題,才解決好。mysql

Hive中的鎖

在執行insert intoinsert overwrite任務時,中途手動將程序停掉,會出現卡死狀況(沒法提交MapReduce),只能執行查詢操做,而drop insert操做均不可操做,不管執行多久,都會保持卡死狀態。sql

查看Hive的中死鎖,可使用show locks [table]來查看。apache

clipboard

能夠看到裏面的那個Type下的EXCLUSIVE,這是一種互斥鎖,須要解決,不然後續的查詢和插入任務都會影響。微信

hive存在兩種鎖,共享鎖Shared (S)和互斥鎖Exclusive (X)併發

S X
S
X

鎖的基本機制是:oop

  • 元信息和數據的變動須要互斥鎖測試

  • 數據的讀取須要共享鎖code

觸發共享鎖的操做是能夠併發執行的,可是觸發互斥鎖,那麼該表和該分區就不能併發的執行做業了。orm

微信截圖_20201207211428

對於上面的狀況,使用解鎖命令:cdn

unlock table tableName

注意:表鎖和分區鎖是兩個不一樣的鎖,對錶解鎖,對分區是無效的,分區須要單獨解鎖

解鎖方法

查看錶被鎖的狀況:

show locks tableName

常規解鎖方法:

unlock table 表名;  -- 解鎖表
unlock table 表名 partition(dt='2014-04-01');  -- 解鎖某個分區

高版本hive默認插入數據時,不能查詢,由於有鎖

可能出現的問題

解鎖之路一般不是一路順風的,可能會遇到各類問題,筆者是在Hive2.1.1下面測試,好比:

clipboard3

這個命令沒法執行,說LockManager沒有指定,這時候須要執行命令:

set hive.support.concurrency=true;
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DummyTxnManager;

這樣從新執行,命令就能夠執行了

若是還!是!不!行,終極方法,能夠直接去mysql元數據執行:

select * from HIVE_LOCKS;

查到全部的鎖,而後根據條件把對應的鎖刪掉,這個鎖住的表便可釋放出來了。

delete from HIVE_LOCKS where HL_DB = 'cdn' and HL_TABLE = 'cdn_log_format';

注意:表名和字段都須要大寫。

經過這種辦法,一般能夠完全解決鎖的問題。

相關文章
相關標籤/搜索