前面遇到過一次由於Hive
中表被鎖住了,致使定時任務一直失敗。這兩天又出現了表被鎖,緣由是鏈接hiveserver2
過於頻繁,mysql
鏈接被打滿,引起的連鎖反應,致使咱們的小時任務一直失敗,下午重點注意到這個問題,才解決好。mysql
在執行insert into
或insert overwrite
任務時,中途手動將程序停掉,會出現卡死狀況(沒法提交MapReduce),只能執行查詢操做,而drop insert
操做均不可操做,不管執行多久,都會保持卡死狀態。sql
查看Hive
的中死鎖,可使用show locks [table]
來查看。apache
能夠看到裏面的那個Type下的EXCLUSIVE,這是一種互斥鎖,須要解決,不然後續的查詢和插入任務都會影響。微信
hive存在兩種鎖,共享鎖Shared (S)
和互斥鎖Exclusive (X)
併發
鎖 | S | X |
---|---|---|
S | 是 | 否 |
X | 否 | 否 |
鎖的基本機制是:oop
元信息和數據的變動須要互斥鎖測試
數據的讀取須要共享鎖code
觸發共享鎖的操做是能夠併發執行的,可是觸發互斥鎖,那麼該表和該分區就不能併發的執行做業了。orm
對於上面的狀況,使用解鎖命令:cdn
unlock table tableName
注意:表鎖和分區鎖是兩個不一樣的鎖,對錶解鎖,對分區是無效的,分區須要單獨解鎖
查看錶被鎖的狀況:
show locks tableName
常規解鎖方法:
unlock table 表名; -- 解鎖表 unlock table 表名 partition(dt='2014-04-01'); -- 解鎖某個分區
高版本hive默認插入數據時,不能查詢,由於有鎖
解鎖之路一般不是一路順風的,可能會遇到各類問題,筆者是在Hive2.1.1
下面測試,好比:
這個命令沒法執行,說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';
注意:表名和字段都須要大寫。
經過這種辦法,一般能夠完全解決鎖的問題。