如下就是一个导致Hive查询慢的线程。
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
at java.util.concurrent.Semaphore.acquire(Semaphore.java:312)
at org.apache.hive.service.cli.session.HiveSessionImpl.acquire(HiveSessionImpl.java:315)
at org.apache.hive.service.cli.session.HiveSessionImpl.executeStatementInternal(HiveSessionImpl.java:471)
从 jstack 日志看,线程因等 Semaphore 锁(Semaphore.acquire)延时,根源是 HiveSessionImpl 的 operationLock 锁
查源码,operationLock 由参数 HIVE_SERVER2_PARALLEL_OPS_IN_SESSION 控制,设为 true 时 operationLock 为 null
该参数设 true 后,不执行 operationLock.acquire,避开锁等待,解决查询延时。