前面遇到过一次由于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';
注意:表名和字段都须要大写。
经过这种办法,一般能够完全解决锁的问题。