众所周知,数据库必须要能够支持并发。无论在任何时候,允许同一时刻,多个用户能够同时读取或写入。没有必要给用户提供API显示的获取锁,所以所有的锁都是隐式获取的。

在Hive中有两种类型的锁:

  • 共享锁Shared(S)
  • 排它锁Exclusive(X)

就如它们的名字一样,可以在同一时刻,获取多个共享锁,但是只能获取一个排它锁。

对于一些操作,锁还是有层次的。例如对于一些分区操作,表也会被锁住,以确保当一个新的分区创建的时候,表不会被drop掉。

锁操作遵循如下规则:

对于非分区表,锁规则是非常直观的。如果需要读取一个表,就加S锁,其它情况都需要加X锁。

对于分区表,规则如下:

当读取某一个分区上的数据时,需要给这个分区添加S锁,对这个分区的其它操作则需要加X锁。然而,如果操作某个分区仅影响到该分区,则需要在该表上添加S锁,如果影响到所有分区,则需要在该表上添加X锁。因此,如果一个分区正在被转换成RCFile,仍然可以读取或写入其它分区,无论一个分区正在加什么类型的锁,它的父级都会加S锁。

基于以上规则,列举一些HQL加锁情况,如下:

HQL
select .. T1 partition P1 S on T1,T1.P1
insert into T2(partition P2) select.. T1 partition P1 S on T2,T1.p1 和 X on T2.P2
insert into T2(partition P.Q) select.. T1 partition P1 S on T2,T2.P,T1,T1.P1和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 onT1
alter table T1 partition P1 concatenate X on T1.P1
drop table X on T1

为了避免死锁,Hive使用了一个简单的规则,对所有即将加锁的对象按照字典顺序排列,然后按照顺序加上相应的锁。注意,在某些情况下,对象的列表是不确定的。例如,一些动态分区的情况下,将要修改的分区的列表在编译时候不能确定。所以,生成的列表是有保留的。既然分区的数量不确定,那么就应该给表(目前并没有,见HIVE-3509 Bug)或能确定的前缀添加排它锁。

可以通过两个参数配置加锁失败重试的次数和每次重试之间的时间间隔。如果重试的次数非常高,将会导致活锁的出现。可以参看Zookeeper了解如何使用zookeeper的api实现读写锁。需要注意的事,如果没有得到锁,加锁的请求将会被拒绝,已经存在的锁将会被释放,所有的锁都会有重试间隔后再次请求加锁。

由于锁具有层级特性,所以并不总是按照上表中的规则进行加锁。

给表添加S锁的规则如下:

  • 调用create()方法创建一个路径名是"/warehouse/T/read-"的节点,这是一个锁节点,将会在后面使用。要确保设置sequence和ephemeral 标识。
  • 调用这个锁节点的getChildren()方法,不设置watch标识
  • 如果有一个子节点,路径名以"write-"开头,并且序列号比自己获取的要小,那么就不能取得锁,并删除在第一步创建的节点然后返回。
  • 否则获取到锁。

给表添加X锁的规则如下:

  • 调用create()方法创建一个路径名是"/warehouse/T/write-"的节点,这是一个锁节点,将会在后面使用。要确保设置sequence和ephemeral 标识。
  • 调用这个锁节点的getChildren()方法,不设置watch标识
  • 如果有一个子节点,路径名以"read-"或"write-"开头,并且序列号比自己获取的要小,那么就不能取得锁,并删除在第一步创建的节点然后返回。
  • 否则获取到锁。

推荐的原则是读优先,如果读取需要花很长时间,将会导致"写操作"的长时间"饥饿"。

Hive默认情况下不支持并发,如果想支持并发,需要将参数: hive.support.concurrency设置为true.

如果出现锁问题,可以使用如下命令调试:

SHOW LOCKS <TABLE_NAME>;

SHOW LOCKS <TABLE_NAME> EXTENDED;

SHOW LOCKS <TABLE_NAME> PARTITION(<PARTITION_DESC>);

SHOW LOCKS <TABLE_NAME> PARTITION(<PARTITION_DESC>) EXTENDED;

Hive学习之Locking的更多相关文章

  1. hive学习

    大数据的仓库Hive学习  10期-崔晓光 2016-06-20  大数据   hadoop   10原文链接 我们接着之前学习的大数据来学习.之前说到了NoSql的HBase数据库以及Hadoop中 ...

  2. Hive学习路线图(转)

    Hadoophivehqlroadmap学习路线图   1 Comment Hive学习路线图 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig ...

  3. 【转】Hive学习路线图

    原文博客出自于:http://blog.fens.me/hadoop-hive-roadmap/ 感谢! Hive学习路线图 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Ha ...

  4. Hive学习之六 《Hive进阶— —hive jdbc》 详解

    接Hive学习五 http://www.cnblogs.com/invban/p/5331159.html 一.配置环境变量 hive jdbc的开发,在开发环境中,配置Java环境变量 修改/etc ...

  5. Hive学习路线图--张丹老师

    前言 Hive是Hadoop家族中一款数据仓库产品,Hive最大的特点就是提供了类SQL的语法,封装了底层的MapReduce过程,让有SQL基础的业务人员,也可以直接利用Hadoop进行大数据的操作 ...

  6. Hive学习 系列博客

    原 Hive作业优化 原 Hive学习六:HIVE日志分析(用户画像) 原 Hive学习五--日志案例分析 原 Hive学习三 原 Hive学习二 原 Hive学习一 博客来源,https://blo ...

  7. hive学习路线

    hive学习路线图:

  8. Hive学习之修改表、分区、列

    Hive学习之修改表.分区.列 https://blog.csdn.net/skywalker_only/article/details/30224309 https://www.cnblogs.co ...

  9. [转帖]Hive学习之路 (一)Hive初识

    Hive学习之路 (一)Hive初识 https://www.cnblogs.com/qingyunzong/p/8707885.html 讨论QQ:1586558083 目录 Hive 简介 什么是 ...

随机推荐

  1. ExceptionLess ASP.NET MVC 异常日志框架

    Exceptionless 一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,ASP.NET Core,Web API,Web Forms,WPF,Console,ASP.NET MVC ...

  2. ASP.NET MVC中设置跨域

    ASP.NET MVC中设置跨域 1.什么是跨域请求 js禁止向不是当前域名的网站发起一次ajax请求,即使成功respone了数据,但是你的js仍然会报错.这是JS的同源策略限制,JS控制的并不是我 ...

  3. c#字典怎么获取第一个键值 List<对象>获取重复项,转成Dictionary<key,List<对象>>

    c#字典怎么获取第一个键值 Dictionary<string, int> dictionary = new Dictionary<string, int>(); dictio ...

  4. Win(Phone)10开发第(5)弹,本地媒体服务器的一些注意事项

    首先有个wp上的http服务器 http://wphttpserver.codeplex.com/ 使用方式: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

  5. 学习 swift (1)

    https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwi ...

  6. Android逆向-java代码基础

    作者:I春秋作家——HAI_ 0×00 前言 看这篇可以先看看之前的文章,进行一个了解.Android逆向-java代码基础(1)Android逆向-java代码基础(2) 之前看到有大佬用smali ...

  7. centos 安装oracle 11g r2(二)-----监听配置与创建数据库实例

    centos 安装oracle 11g r2(二)-----监听配置与创建数据库实例 一.监听配置(命令:netca) 1.以 oracle 用户输入命令,启动图形化工具配置监听 [oracle@lo ...

  8. DOM操作复选框

    DOM操作复选框 实现一个效果如下图: 点击"全选/全不选"复选框之后,足球.篮球.游泳和唱歌均被选取.取消"全选/全不选"复选框之后,被选中的所有都变成未选中 ...

  9. css之px自动转rem—sublime 插件CSSREM

    CSSREM CSSREM 是一个CSS的 px 值转 rem 值的Sublime Text3自动完成插件.先来看看插件的效果: 一个CSS的px值转rem值的Sublime Text 3自动完成插件 ...

  10. 【原创】SSRS (SQL Serve Reporting Service) 访问权限的问题

    问题:The permissions granted to user 'TOUCHPOINTMED\sshi' are insufficient for performing this operati ...