Hive锁表的问题

前言

旁边的实习生一副很无奈的表情:集群又出现问题了,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数据,该数据在本次读时不会被加载,下次读操作时才会被加载。

解决锁表

  1. 查询是否锁表
hive> show locks;
OK
ods@tableA	EXCLUSIVE

发现ods库下的tableA表被锁

  1. 临时解决办法
unlock table ods.tableA;
unlock table test partition(date='2019-12-12'); //解锁分区锁命令可以用这个
  1. 关闭锁机制
set hive.support.concurrency=false; // 默认为true

当然用set命令,只要断开和hive的连接,下次则失效

  1. 永久关闭锁机制
    在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 评论

留下您的评论.