Hive系列文章
Hive表的基本操作
Hive中的集合數據類型
Hive動態分區詳解
hive中orc格式表的數據導入
Java通過jdbc連接hive
通過HiveServer2訪問Hive
SpringBoot連接Hive實現自助取數
hive關聯hbase表
Hive udf 使用方法
Hive基於UDF進行文本分詞
Hive窗口函數row number的用法
數據倉庫之拉鏈表
前面遇到過一次因為Hive
中表被鎖住了,導致定時任務一直失敗。這兩天又出現了表被鎖,原因是連接hiveserver2
過於頻繁,mysql
連接被打滿,引發的連鎖反應,導致我們的小時任務一直失敗,下午重點注意到這個問題,才解決好。
Hive中的鎖
在執行insert into
或insert overwrite
任務時,中途手動將程序停掉,會出現卡死情況(無法提交MapReduce),只能執行查詢操作,而drop insert
操作均不可操作,無論執行多久,都會保持卡死狀態。
查看Hive
的中死鎖,可以使用show locks [table]
來查看。
可以看到里面的那個Type下的EXCLUSIVE,這是一種互斥鎖,需要解決,否則后續的查詢和插入任務都會影響。
hive存在兩種鎖,共享鎖Shared (S)
和互斥鎖Exclusive (X)
鎖 | S | X |
---|---|---|
S | 是 | 否 |
X | 否 | 否 |
鎖的基本機制是:
-
元信息和數據的變更需要互斥鎖
-
數據的讀取需要共享鎖
觸發共享鎖的操作是可以並發執行的,但是觸發互斥鎖,那么該表和該分區就不能並發的執行作業了。
對於上面的情況,使用解鎖命令:
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';
注意:表名和字段都需要大寫。
通過這種辦法,通常可以徹底解決鎖的問題。