前言
旁边的实习生一副很无奈的表情:集群又出现问题了,hive一直卡住不能用。我看了一下他执行的hivesql,发现他想查询我正在往Hive中导数据的表,这个时候Hive由于锁的问题,是无法查询的,那么数据库的锁究竟是什么东东呢?
数据库锁
详情参考
锁主要是为了保证数据的完整性和一致性
Hive中的锁
详细请看官网
hive存在两种锁,共享锁 Shared (S)和互斥锁 Exclusive (X),
其中只触发s锁的操作可以并发的执行,只要有一个操作对表或者分区出发了x锁,则该表或者分区不能并发的执行作业。
各个操作锁出发的锁如下:
补充一条,load data (local) inpath ’ ’ into table xx partition() 出发的锁操作同insert
直接在hadoop上 hadoop dfs -put xx yy 不触发锁。(可以用在shell上 执行 hadoop dfs -put file hdfsmulu 这两天命令来代替 load data,避免锁)
load data 时若分区不存在会创建分区,而hadoop dfs -put不会, 需先调用alter table add partition来创建分区。 若一个操作正在读取表中数据,这时向表的分区中put数据,该数据在本次读时不会被加载,下次读操作时才会被加载。
解决锁表
- 查询是否锁表
hive> show locks;
OK
ods@tableA EXCLUSIVE
发现ods库下的tableA表被锁
- 临时解决办法
unlock table ods.tableA;
unlock table test partition(date='2019-12-12'); //解锁分区锁命令可以用这个
- 关闭锁机制
set hive.support.concurrency=false; // 默认为true
当然用set命令,只要断开和hive的连接,下次则失效
- 永久关闭锁机制
在hive-site.xml文件中追加:
<property><name>set hive.txn.manager</name><value>org.apache.hadoop.hive.ql.lockmgr.DummyTxnManager</value>
</property>
本文链接:https://my.lmcjl.com/post/12989.html
展开阅读全文
4 评论