Hive学习之Locking
众所周知,数据库必须要能够支持并发。无论在任何时候,允许同一时刻,多个用户能够同时读取或写入。没有必要给用户提供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的更多相关文章
- hive学习
大数据的仓库Hive学习 10期-崔晓光 2016-06-20 大数据 hadoop 10原文链接 我们接着之前学习的大数据来学习.之前说到了NoSql的HBase数据库以及Hadoop中 ...
- Hive学习路线图(转)
Hadoophivehqlroadmap学习路线图 1 Comment Hive学习路线图 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig ...
- 【转】Hive学习路线图
原文博客出自于:http://blog.fens.me/hadoop-hive-roadmap/ 感谢! Hive学习路线图 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Ha ...
- Hive学习之六 《Hive进阶— —hive jdbc》 详解
接Hive学习五 http://www.cnblogs.com/invban/p/5331159.html 一.配置环境变量 hive jdbc的开发,在开发环境中,配置Java环境变量 修改/etc ...
- Hive学习路线图--张丹老师
前言 Hive是Hadoop家族中一款数据仓库产品,Hive最大的特点就是提供了类SQL的语法,封装了底层的MapReduce过程,让有SQL基础的业务人员,也可以直接利用Hadoop进行大数据的操作 ...
- Hive学习 系列博客
原 Hive作业优化 原 Hive学习六:HIVE日志分析(用户画像) 原 Hive学习五--日志案例分析 原 Hive学习三 原 Hive学习二 原 Hive学习一 博客来源,https://blo ...
- hive学习路线
hive学习路线图:
- Hive学习之修改表、分区、列
Hive学习之修改表.分区.列 https://blog.csdn.net/skywalker_only/article/details/30224309 https://www.cnblogs.co ...
- [转帖]Hive学习之路 (一)Hive初识
Hive学习之路 (一)Hive初识 https://www.cnblogs.com/qingyunzong/p/8707885.html 讨论QQ:1586558083 目录 Hive 简介 什么是 ...
随机推荐
- 基于tinyproxy搭建代理服务器
在我们实际的工作当中,经常会遇到这种情况,我们对线上服务器进行操作时是通过跳板机来进行的,出于安全性及投入资金来考虑非必要情况下除跳板机以外的服务器是没有内网ip的,所以当我们位于内网的服务器需要使用 ...
- sun.jersey使用Jackson转换数据
差点被com.sun.jersey自身的json转换吓死,遇到List等类型,会把这些也转换为json对象,而不是jsonarray. 被园里的同行拯救了,在web.xml中配置一下就ok. < ...
- Java反射reflection与注解annotation的应用(自动测试机)
一.关于自动测试机 1.什么是自动测试机? 对类中的指定方法进行批量测试的工具 2.自动测试机有什么用? a.避免了冗长的测试代码 当类中的成员方法很多时,对应的测试代码可能会很长,使用测试能够让测试 ...
- Asp.Net 跨域,Asp.Net MVC 跨域,Session共享,CORS,Asp.Net CORS,Asp.Net MVC CORS,MVC CORS
比如 http://www.test.com 和 http://m.test.com 一.简单粗暴的方法 Web.Config <system.web> <!--其他配置 省略……- ...
- C# 读取Excel,一波华丽的操作
C# 读取Excel,其实有很多方法.但是今天要来一波华丽的操作. 先看效果: 以上这波操作使用了 ExcelDataReader 和 ExcelDataReader.DataSet 完成的. Exc ...
- .Net Core + DDD基础分层 + 项目基本框架 + 个人总结
为什么要写这篇文章 1,在大半年前,公司开发任务比较轻松,自己不知道干什么,但是又想要学习技术,比较迷茫,后面我接触到了博客园,看了一个帖子,深有感触,我当时不知道学习什么,于是我信息给他,他居然回复 ...
- AJPFX简评:MT5平台
MetaTrader 5全面改进的图表和扩展的功能 MetaTrader软件开发商在MT4获得全球交易商全面好评之后,又再次研发推出了更为先进的MT5交易软件. MT5的主要特征●改进的图表和即时 ...
- Map容器中keySet()、entrySet()
1.定义 keySet(): 返回的是只存放key值的Set集合,使用迭代器方式遍历该Set集合,在迭代器中再使用get方法获取每一个键对应的值.使用get方法获取键对应的值时就需要遍历Map集合,主 ...
- Flask的WTforms
一.简单介绍 WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 类似于Django中的modelform 安装: pip3 install wtforms 二.简 ...
- Retrofit源码解析(下)
接着上一章继续分析上一章主要简单说了一下基本使用和注解,这一章,我们主要看源码,废话不多说了,直接上.先上一张图 从网络上拿来的 前面一章说了一下Retrofit的简单使用https://www.cn ...