Hive中的鎖的用法和使用場景

前面遇到過一次因為Hive中表被鎖住了,導致定時任務一直失敗。這兩天又出現(xiàn)了表被鎖,原因是連接hiveserver2過于頻繁,mysql連接被打滿,引發(fā)的連鎖反應,導致我們的小時任務一直失敗,下午重點注意到這個問題,才解決好。

Hive中的鎖

在執(zhí)行insert intoinsert overwrite任務時,中途手動將程序停掉,會出現(xiàn)卡死情況(無法提交MapReduce),只能執(zhí)行查詢操作,而drop insert操作均不可操作,無論執(zhí)行多久,都會保持卡死狀態(tài)。

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

可以看到里面的那個Type下的EXCLUSIVE,這是一種互斥鎖,需要解決,否則后續(xù)的查詢和插入任務都會影響。

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

S X
S
X

鎖的基本機制是:

  • 元信息和數(shù)據(jù)的變更需要互斥鎖
  • 數(shù)據(jù)的讀取需要共享鎖

觸發(fā)共享鎖的操作是可以并發(fā)執(zhí)行的,但是觸發(fā)互斥鎖,那么該表和該分區(qū)就不能并發(fā)的執(zhí)行作業(yè)了。

對于上面的情況,使用解鎖命令:

unlock table tableName
SQL

注意表鎖和分區(qū)鎖是兩個不同的鎖,對表解鎖,對分區(qū)是無效的,分區(qū)需要單獨解鎖

解鎖方法

查看表被鎖的情況:

show locks tableName
SQL

常規(guī)解鎖方法:

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

高版本hive默認插入數(shù)據(jù)時,不能查詢,因為有鎖

可能出現(xiàn)的問題

解鎖之路通常不是一帆風順的,可能會遇到各種問題,筆者是在Hive2.1.1下面測試,比如:

這個命令無法執(zhí)行,說LockManager沒有指定,這時候需要執(zhí)行命令:

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

這樣重新執(zhí)行,命令就可以執(zhí)行了

如果還!是!不!行,終極方法,可以直接去mysql元數(shù)據(jù)執(zhí)行:

select * from HIVE_LOCKS;
SQL

查到所有的鎖,然后根據(jù)條件把對應的鎖刪掉,這個鎖住的表即可釋放出來了。

delete from HIVE_LOCKS where HL_DB = 'cdn' and HL_TABLE = 'cdn_log';
SQL

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

通過這種辦法,通??梢詮氐捉鉀Q鎖的問題。





作者:柯廣的網(wǎng)絡(luò)日志

微信公眾號:Java大數(shù)據(jù)與數(shù)據(jù)倉庫