众所周知,数据库必须要能够支持并发。无论在任何时候,允许同一时刻,多个用户能够同时读取或写入。没有必要给用户提供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. 你好,Azure DevOps Server 2019;再见,Team Foundation Server

    微软正式发布Azure DevOps Server 2019的第一个版本,作为Team Foundation Server (TFS)2018的升级版本和替代产品. 这是目前市面上唯一一款将产品名称冠 ...

  2. Java反射reflection与注解annotation的应用(自动测试机)

    一.关于自动测试机 1.什么是自动测试机? 对类中的指定方法进行批量测试的工具 2.自动测试机有什么用? a.避免了冗长的测试代码 当类中的成员方法很多时,对应的测试代码可能会很长,使用测试能够让测试 ...

  3. SHT20 IIC总线驱动概述

    SHT20温湿度传感器使用iic总线的驱动方式,以下资料参考SHT20 datasheet总结 1.IIC总线 Start信号 IIC总线的起始信号以SDA由高电平变为低电平,等待5us以上,再由SC ...

  4. sharepoint 2013 office web app 2013 文档在线浏览 IE11 浏览器不兼容解决方法

    昨晚配置完成office web apps 2013的外部网络访问之后,今天发现了一个很奇怪的问题,就是IE 11不支持文档在线浏览,找了很多方法,打补丁什么的,都不管用,最后在预览文件的页面,看到& ...

  5. 3.jquery在js文件中获取选择器对象

    一.常用的选择器有一下几种: 1.标签选择器 2.类选择器 3.id选择器 4.并集选择器 5.层级选择器 二.如何获取选择器对象: <!DOCTYPE html> <html la ...

  6. Queue-621. Task Scheduler

    Given a char array representing tasks CPU need to do. It contains capital letters A to Z where diffe ...

  7. Spring Boot快速搭建Web工程

    先想一下,正常我们想要创建一个web服务,首先需要下载tomcat,创建web工程,配置各种web.xml,引入spring的配置,各种配置文件一顿倒腾.....下载有了spring boot,你创建 ...

  8. 【python入门】之教你编写自动获取金币脚本

    本文作者:青衫磊落 最近看到个特别全面源码分享网站,刚好有个项目是一直想做但是没有头绪的,就想下载学习一下.注册账号后,发现还需要若干金币.后来发现可以通过每隔一定时间发心情状态来获得金币,就打算写一 ...

  9. 加快mysql导入导出速度

    MySQL导出的SQL语句在处理百万级数据的时候,可能导入要花几小时.在导出时合理使用几个参数,可以大大加快导入的速度. -e 使用包括几个VALUES列表的多行INSERT语法; --max_all ...

  10. JavaScript 之基础知识

    JavaScript 基础知识 JavaScript 是属于网络的脚本语言! JavaScript 被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies,以及更多的应用. JavaS ...