1.背景

在数据仓库开发中,遇到了读取数据任务导致锁表问题,发现是因为补数据或月度大任务跨天运行,此时凌晨定时的写入操作就会被阻塞进入等待状态(如果超过最大等待时间会失败),直到读取任务完成写入任务才可以继续运行,导致当天结果层数据输出延迟。因此分析并总结下锁表机制原理以及解决方式。

2.锁机制及原理分析

Hive 目前主要有两种锁,SHARED(共享锁 S)和 Exclusive(排他锁 X),同时又分表锁与分区锁,分区锁为最小粒度;共享锁 S 和  排他锁 X 它们之间的兼容性矩阵关系如下:

解释:

  • 1)表锁与分区锁,分区锁为最小粒度(如果表锁未锁写入的分区,是可以执行写入任务的)
  • 2)查询操作使用共享锁(S锁),共享锁是可以多重、并发使用的(就是说其他查询也可以挂S锁,并发查询不会阻塞修改会阻塞)
  • 3)修改表操作使用独占锁(X锁),它会阻止其他的查询、修改操作
  • 4)S锁和X锁同时出现会出现死锁情况(查询和写入不可同时发生)

以下情况会出发锁,以及它的类型和锁定范围如下:

Hive Command

Locks Acquired

select .. T1 partition P1

S on T1, T1.P1

insert into T2(partition P2) select .. T1 partition P1

S on T2, T1, T1.P1 and X on T2.P2

insert into T2(partition P.Q) select .. T1 partition P1

S on T2, T2.P, T1, T1.P1 and X on T2.P.Q

alter table T1 rename T2

X on T1

alter table T1 add cols

X on T1

alter table T1 replace cols

X on T1

alter table T1 change cols

X on T1

alter table T1 concatenate

X on T1

alter table T1 add partition P1

S on T1, X on T1.P1

alter table T1 drop partition P1

S on T1, X on T1.P1

alter table T1 touch partition P1

S on T1, X on T1.P1

alter table T1 set serdeproperties

S on T1

alter table T1 set serializer

S on T1

alter table T1 set file format

S on T1

alter table T1 set tblproperties

X on T1

alter table T1 partition P1 concatenate

X on T1.P1

drop table T1

X on T1

3.解决方式

Hive锁机制会影响我们数据仓库输出效率,如果在已知表/分区的解锁对正运行的任务没有影响情况下我们可以在session 中关闭锁,通常我们会在X锁操作任务加上set hive.support.concurrency=false; 这个参数为 false 既能保证session忽略任何锁强行操作数据,又能保证session里的SQL对表不加任何锁;非分区表慎用由于不加锁写入时候同时读取会导致数据一致性问题。

排查及解决流程:

show locks tableName; #查看表锁show locks tableName partition(dt='2014-04-01'); #查看分区锁unlock table; unlock table partition(dt='2014-04-01'); #解锁表set hive.support.concurrency=false; #在 session 中关闭锁默认为true,

4.拓展分析

排查锁问题方式

SHOW LOCKS <TABLE_NAME>; #查看HIVE表是否被锁
SHOW LOCKS <TABLE_NAME> EXTENDED;#查看哪一个SQL锁了HIVE表
SHOW LOCKS <TABLE_NAME> PARTITION (<PARTITION_DESC>); #查看HIVE表分区是否被锁
SHOW LOCKS <TABLE_NAME> PARTITION (<PARTITION_DESC>) EXTENDED;#查看哪一个SQL锁了HIVE表分区

hive锁的几个配置,可以在锁冲突时 fail fast 或者 重试等待锁释放

(hive默认的sleep时间是60s,比较长,在高并发场景下,可以减少这个的数值来提供job的效率)

hive.lock.numretries #重试次数
hive.lock.sleep.between.retries #重试时sleep的时间

Hive(CDH4.2.0)的锁处理流程:

1.首先对query进行编译,生成QueryPlan2.构建读写锁对象(主要两个成员变量:LockObject,Lockmode)对于非分区表,直接根据需要构建S或者X锁对象对于分区表:(此处是区分input/output)
If S mode:直接对Table/related partition 构建S对象
Else:If 添加新分区:构建S对象Else构建X对象
End3.对锁对象进行字符表排序(避免死锁),对于同一个LockObject,先获取Execlusive4.遍历锁对象列表,进行锁申请
While trynumber< hive.lock.numretries(default100):创建parent(node)目录,mode= CreateMode.PERSISTENT创建锁目录,mode=CreateMode.EPHEMERAL_SEQUENTIALFor Child:ChildrenIf Child已经有写锁:获取child写锁seqnoIf mode=X 并且 Child 已经有读锁获取child读锁seqnoIf childseqno>0并且小于当前seqno释放锁Trynumber++Sleep(hive.lock.sleep.between.retries:default1min)

5.总结:

避免Hive因为锁导致的读写任务阻塞等待或失败:

1、建议表设置分区,因为锁可以到分区粒度,防止大字典表,单张全量表类似表长时间锁表,导致长时间阻塞读写任务。

2、如果新分区被锁可以通过 set hive.support.concurrency=false 来关闭锁机制,保证新分区写入数据成功。非分区表慎用由于不加锁写入时候同时读取会导致数据一致性问题。

3、脚本重跑一段时间范围数据时设置 sleep 间隔,避免长期持有锁,造成依赖此表的下游任务调度失败(这种方式需要根据下游任务分析运行状态时间)。

6.参考资料:

[1] Hive官方文档:锁

Locking - Apache Hive - Apache Software Foundation

[2] hive lock的配置

hive lock的配置问题_weixin_34239169的博客-CSDN博客

【Hive】Hive锁机制分析及任务问题处理相关推荐

  1. MySQL事务分析和锁机制分析

    MySQL事务分析和锁机制分析 事务 事务控制语句 目的 组成 特征 概念 redo日志 undo日志 MVCC多版本并发控制Multi version concurrency control ACI ...

  2. OB锁机制分析和测试

    OB锁机制分析 OB锁机制:https://www.oceanbase.com/docs/community/observer-cn/V3.1.3/0000000000161645 ob的锁是行级锁, ...

  3. [转载] 数据库分析手记 —— InnoDB锁机制分析

    作者:倪煜 InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工 ...

  4. oracle 分析锁,ORACLE锁机制分析

    Oracle 多粒度锁机制介绍 根据保护对象的不同,Oracle数据库锁可以分为以下几大类: (1) DML lock(data locks,数据锁):用于保护数据的完整性: (2) DDL lock ...

  5. openVswitch(OVS)源代码之linux RCU锁机制分析

    前言 本来想继续顺着数据包的处理流程分析upcall调用的,但是发现在分析upcall调用时必须先了解linux中内核和用户空间通信接口Netlink机制,所以就一直耽搁了对upcall的分析.如果对 ...

  6. 从Android应用层及Framework层的角度分析WakeLock锁机制

      从Android应用层及Framework层的角度分析WakeLock锁机制 本篇博客编写思路总结和关键点说明: 为了更加方便的读者阅读博客,通过导读思维图的形式将本博客的关键点列举出来,从而方便 ...

  7. SQL优化之一则MySQL中的DELETE、UPDATE 子查询的锁机制失效案例

    关注"数据和云",精彩不容错过 前言 开发与维护人员避免不了与 in/exists.not in/not exists 子查询打交道,接触过的人可能知道 in/exists.not ...

  8. 大数据开发之Hive篇17-Hive锁机制

    备注: Hive 版本 2.1.1 文章目录 一.Hive锁概述 二.Hive 锁相关操作 2.1 Hive的并发性 2.2 查看表的锁 2.3 解锁 三.Hive 事务表锁机制 四.Hive 锁测试 ...

  9. Flume+Spark+Hive+Spark SQL离线分析系统

    前段时间把Scala和Spark一起学习了,所以借此机会在这里做个总结,顺便和大家一起分享一下目前最火的分布式计算技术Spark!当然Spark不光是可以做离线计算,还提供了许多功能强大的组件,比如说 ...

最新文章

  1. 集合list set Map问题
  2. 20145209 2016-2017-2 《Java程序设计》第7周学习总结
  3. JAVA中定义常量的几种方式
  4. JMeter Sampler之BeanShellSampler的使用
  5. 21、Power Query-列文本格式处理
  6. python可选参数位置_每个位置参数的可选参数
  7. java entity公共属性_java – 如何从Entity Manager获取jpa数据源属性
  8. codevs-2235
  9. 华为下调2020年印度市场收入目标,或裁员60%至70%
  10. I00022 孙子定理
  11. (转)iOS 屏幕适配
  12. AWK相关学习(转)
  13. 三星s8刷机包android10版本,三星S8+刷机包(官方固件最新升级包v7.0)
  14. 从行业到技术,10+年资深工程师带你进行嵌入式行业职业规划!
  15. 区块链的20种应用场景
  16. HP LaserJet 1020打印机显示脱机,脱机使用打印机的勾去不掉
  17. 双绞线接头(RJ45)连接方法详解
  18. 2020德勤面试开始了吗_四大2020年春招时间曝光!
  19. 响应状态码1xx , 2xx,3xx , 4xx , 5xx
  20. C语言编程统计八皇后问题的解的个数,八皇后问题C语言解法

热门文章

  1. QM 、QA和QC的区别
  2. LeetCode练习题:斐波那契数列
  3. 相机光学(一)——成像系统分辨率的理论
  4. C++ 字元陣列(C-style)、字元指標、String類別 使用方式整理
  5. 深入了解canvas标签(3)——使用图像
  6. 《Java-第十一章》之图书管理系统
  7. java 创建用户界面_建立图形用户界面 JAVA实验
  8. var foo = function(){} 和 function foo(){}
  9. 协议篇————3、DUP协议详解
  10. sql oracle 退格键,Oraclesqlplus中方向键、退格键的使用是怎样的? 爱问知识人