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的效率。
本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1344453,如需转载请自行联系原作者