問題描述
在對hive表執行alert的時候,發現卡住不動了,退出後重進嘗試drop表,依然卡住不動。
找解決方案如下:
1.網上的方案:
先進入mysql,執行
show variables like 'char%'
查看character_set_database 的value是latin
然後把latin改成utf-8就好了,然後就解決了。
然而實際的情況不是這個樣子的,我這邊mysql裏面明明就是utf-8,那麼真相只有一個——鎖表了!
那麼只能自己想想辦法了
2.解鎖方案
進入hive,執行
show locks;
查看鎖表情況,發現如下
可以看到裏面的那個Blocked By下的EXCLUSIVE
這裏簡單說一下:hive存在兩種鎖,共享鎖Shared (S)和互斥鎖Exclusive (X)
觸發共享鎖的操作是可以併發執行的
但是觸發互斥鎖,那麼該表和該分區就不能併發的執行作業了。
於是開始嘗試解鎖:
unlock table 表名;
但是給我報錯了:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.
Current transaction manager does not support explicit lock requests. Transaction manager:
org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
但是再次使用 show locks;
發現之前的鎖沒了
之前遇到怎麼都刪不掉的情況,解決辦法是執行:
set hive.support.concurrency=false;
這個是hive的鎖機制,可以暫時關掉,默認是true。關掉之後就可以刪除表了,刪掉之後可以再把它設置爲true。但是會有遺留問題,我們會發現那個鎖依舊沒掉!
這時候需要去執行
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DummyTxnManager;
然後再去unlock那個鎖!
如果還!是!不!行!
直接去mysql元數據執行:
select * from HIVE_LOCKS;
查到所有的鎖,然後選擇幹掉
DELETE FROM hive_locks where ...