昨天線上ETLJob忽然掛起,查看Hive Log異常:java
[ERROR]:Utils - FAILED: Error in acquiring locks: Locks on the underlying objectscannot be acquired. retry after some timeapache
WARNunexpected error, closing socket connection and attempting reconnectjava.io.IOException: Connection reset by peersocket
一看是獲取鎖失敗,關於Hive獲取鎖的流程簡析:ide
http://boylook.blog.51cto.com/7934327/1308139ui
在看ZK發現從這臺Agent到ZK的鏈接已經超過maxClientCnxns了,馬上先把ZK增長問題獲得緩解,而後開始找RC:spa
出現問題的前一天修改了hive.lock.sleep.between.retries到5s,是否是和這個有關係呢?每次ZKLockManager在retry前會執行prepareretry,主要是檢查前一個zk鏈接是否超時,若是沒有繼續用這個鏈接不然new一個zk鏈接,所以問題不該該是這裏.線程
再看出問題的Client上主要跑了ETL agent和hiveserver2,發現鏈接都是從hiveserver2上來的,懷疑是否是由於默認的maxWorkerThreads略大了,不過worker和zk的鏈接無關,只是決定了ThreadPoolExecutor的線程數,看hiveserver部分代碼最終與ZK交互的執行層面是OperationHandle,進而就是你們都熟悉的Driver run方法了,到這裏基本上纔開始進行SQL的解析運行,包括鎖的處理.server
而咱們使用的是CDH4.2.0,這裏有一個OperationHandle 資源泄露進而致使到ZK鏈接泄漏的一個Bug:blog
https://issues.cloudera.org/browse/DISTRO-512?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel#issue-tabs–> HIVE-4398,在Hive0.11已經修復資源