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
转载于:https://blog.51cto.com/caiguangguang/1344453