完全理解Hive中的锁

前面遇到过一次由于Hive中表被锁住了,致使定时任务一直失败。这两天又出现了表被锁,缘由是链接hiveserver2过于频繁,mysql链接被打满,引起的连锁反应,致使咱们的小时任务一直失败,下午重点注意到这个问题,才解决好。mysql

Hive中的锁

在执行insert intoinsert overwrite任务时,中途手动将程序停掉,会出现卡死状况(没法提交MapReduce),只能执行查询操做,而drop insert操做均不可操做,不管执行多久,都会保持卡死状态。sql

查看Hive的中死锁,可使用show locks [table]来查看。apache

clipboard

能够看到里面的那个Type下的EXCLUSIVE,这是一种互斥锁,须要解决,不然后续的查询和插入任务都会影响。微信

hive存在两种锁,共享锁Shared (S)和互斥锁Exclusive (X)并发

S X
S
X

锁的基本机制是:oop

  • 元信息和数据的变动须要互斥锁测试

  • 数据的读取须要共享锁code

触发共享锁的操做是能够并发执行的,可是触发互斥锁,那么该表和该分区就不能并发的执行做业了。orm

微信截图_20201207211428

对于上面的状况,使用解锁命令:cdn

unlock table tableName

注意:表锁和分区锁是两个不一样的锁,对表解锁,对分区是无效的,分区须要单独解锁

解锁方法

查看表被锁的状况:

show locks tableName

常规解锁方法:

unlock table 表名;  -- 解锁表
unlock table 表名 partition(dt='2014-04-01');  -- 解锁某个分区

高版本hive默认插入数据时,不能查询,由于有锁

可能出现的问题

解锁之路一般不是一路顺风的,可能会遇到各类问题,笔者是在Hive2.1.1下面测试,好比:

clipboard3

这个命令没法执行,说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';

注意:表名和字段都须要大写。

经过这种办法,一般能够完全解决锁的问题。

相关文章
相关标签/搜索