hive在0.7版本之后开始支持并发,线上的环境是用zookeeper做hive的锁管理。

hive目前主要有两种锁,SHARED(共享锁s)和IMPLICIT(排他锁x)。


hive的锁在某些情况下会影响job的效率。在对数据一致性要求不高或者已经明确了解到lock不会对job产生影响的情况下可以在session级别关闭lock的支持。

场景1:

离线下载分析商业cdn的qos job。

使用load data将数据导入hive中,hive的表按dt,hour,domain进行明确分区,因此,是否有锁对数据的一致性影响不大,反而有了锁之后,job之间就会有锁竞争的问题(报错信息:conflicting lock present for table  mode EXCLUSIVE)。


调整job:

hive --database cdnlog -e "set hive.support.concurrency=false;load data local inpath 'file' OVERWRITE into table chinanetcenter_log_origin partition(dt='2013-12-17',hour='04',domain='xxx')"

数据load时就不会有报错了,效率也高了不少


场景2:

hive锁的几个配置

hive.lock.numretries #重试次数
hive.lock.sleep.between.retries #重试时sleep的时间

hive默认的sleep时间是60s,比较长,在高并发场景下,可以减少这个的数值来提供job的效率。


关于hive的lock获取流程可以参考同事的一篇博客:

http://boylook.blog.51cto.com/7934327/1308139