hive连接mysql锁_hive0.13数据库锁问题fix

之前同事处理的一个case,记录下

hive升级到0.13之后,在创建表时,发现报锁竞争的问题,信息如下:conflicting lock present for vipdw mode EXCLUSIVE

hive中有锁是没有问题,但是这里的锁却是数据库层面的锁!而且是排他锁!这个锁的粒度就太大了,这个锁会导致所有的关于这个库的hive操作都要等待这个锁的释放.

这个应该是去拿表的锁啊。。怎么可以拿库的锁。。

根据之前的分析,hive的锁由DummyTxnManager类实现:

在DummyTxnManager类中,关于EXCLUSIVE锁的获取如下

代码路径:ql/src/java/org/apache/hadoop/hive/ql/lockmgr/DummyTxnManager.java

原始代码:for (WriteEntity output : plan.getOutputs()) {

LOG.debug("Adding " + output.getName() + " to list of lock outputs");

List lockObj = null;

if (output.getType() == WriteEntity.Type.DATABASE) {

lockObjects.addAll(getLockObjects(plan, output.getDatabase(), null,

null,

output.isComplete() ? HiveLockMode.EXCLUSIVE : HiveLockMode.SHARED));

} else if (output.getTyp() == WriteEntity.Type.TABLE) {

lockObj = getLockObjects(plan, null, output.getTable(), null,

output.isComplete() ? HiveLockMode.EXCLUSIVE : HiveLockMode.SHARED);

} else if (output.getTyp() == WriteEntity.Type.PARTITION) {

lockObj = getLockObjects(plan, null, null, output.getPartition(),

HiveLockMode.EXCLUSIVE);

}

// In case of dynamic queries, it is possible to have incomplete dummy partitions

else if (output.getTyp() == WriteEntity.Type.DUMMYPARTITION) {

lockObj = getLockObjects(plan, null, null, output.getPartition(),

HiveLockMode.SHARED);

}

if(lockObj != null) {

lockObjects.addAll(lockObj);

ctx.getOutputLockObjects().put(output, lockObj);

}

}

更改源码,把数据库的排它锁这一段去掉:for (WriteEntity output : plan.getOutputs()) {

LOG.debug("Adding " + output.getName() + " to list of lock outputs");

List lockObj = null;

if (output.getType() == WriteEntity.Type.DATABASE) {

LOG.debug("Output has database:" +output.getDatabase());

LOG.debug("Removing unnecessary output lock aquirement on "+output .getDatabase()+" database" );

// lockObjects.addAll(getLockObjects(plan, output.getDatabase(), null,

// null,

// output.isComplete() ? HiveLockMode.EXCLUSIVE : HiveLockMode.SHARED));

} else if (output.getTyp() == WriteEntity.Type.TABLE) {

lockObj = getLockObjects( plan, null, output.getTable(), null,

output.isComplete() ? HiveLockMode.EXCLUSIVE : HiveLockMode .SHARED);

} else if (output.getTyp() == WriteEntity.Type.PARTITION) {

lockObj = getLockObjects( plan, null, null, output.getPartition(),

HiveLockMode.EXCLUSIVE);

}

// In case of dynamic queries, it is possible to have incomplete dummy partitions

else if (output.getTyp() == WriteEntity.Type.DUMMYPARTITION) {

lockObj = getLockObjects( plan, null, null, output.getPartition(),

HiveLockMode.SHARED);

}

if(lockObj != null) {

lockObjects.addAll(lockObj);

ctx.getOutputLockObjects().put(output , lockObj);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值