彻底理解Hive中的锁

简介: 前面遇到过一次因为Hive中表被锁住了,导致定时任务一直失败。这两天又出现了表被锁,原因是连接hiveserver2过于频繁,mysql连接被打满,引发的连锁反应,导致我们的小时任务一直失败,下午重点注意到这个问题,才解决好。

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


Hive中的锁


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


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


微信图片_20220429164600.png

可以看到里面的那个Type下的EXCLUSIVE,这是一种互斥锁,需要解决,否则后续的查询和插入任务都会影响。


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

S X
S
X

锁的基本机制是:


  • 元信息和数据的变更需要互斥锁


  • 数据的读取需要共享锁


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

微信图片_20220429164605.png


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

unlock table tableName


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


解锁方法


查看表被锁的情况:


show locks tableName

常规解锁方法:

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

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


可能出现的问题


解锁之路通常不是一帆风顺的,可能会遇到各种问题,笔者是在Hive2.1.1下面测试,比如:

微信图片_20220429164612.png


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


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


通过这种办法,通常可以彻底解决锁的问题。

目录
相关文章
|
5月前
|
SQL JSON 数据库
Hive【Hive(一)DDL】
Hive【Hive(一)DDL】
|
6月前
|
SQL 存储 分布式计算
Hive的简单操作
Hive的简单操作
29 0
|
7月前
|
SQL 分布式计算 调度
深入剖析 HIVE 的锁和事务机制
深入剖析 HIVE 的锁和事务机制
|
SQL 关系型数据库 MySQL
|
26天前
|
SQL 存储 分布式计算
【Hive】请谈一下Hive的特点,Hive和RDBMS有什么异同?
【4月更文挑战第17天】【Hive】请谈一下Hive的特点,Hive和RDBMS有什么异同?
|
27天前
|
SQL 存储 算法
【Hive】Hive 小文件过多怎么解决?
【4月更文挑战第16天】【Hive】Hive 小文件过多怎么解决?
|
5月前
|
SQL Java HIVE
Hive rlike和like区别
Hive rlike和like区别
79 0
|
10月前
|
SQL HIVE
Hive 中 4 个 By 的区别
Hive 中 4 个 By 的区别
81 1
|
5月前
|
SQL 分布式计算 Hadoop
Hive【Hive(二)DML】
Hive【Hive(二)DML】
|
9月前
|
SQL 存储 数据库
Hive的常用HiveQL操作
Hive的常用HiveQL操作
130 0