问题描述:在数据中台上运行一段的时间后,有个别任务出现这样的报错:
ERROR : FAILED: Error in acquiring locks: Locks on the underlying objects cannot be acquired. retry after some time
org.apache.hadoop.hive.ql.lockmgr.LockException: Locks on the underlying objects cannot be acquired. retry after some time
at org.apache.hadoop.hive.ql.lockmgr.DummyTxnManager.acquireLocks(DummyTxnManager.java:190)
at org.apache.hadoop.hive.ql.Driver.acquireLocksAndOpenTxn(Driver.java:1244)
at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1557)
at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1339)
at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1334)
at org.apache.hive.service.cli.operation.SQLOperation.runQuery(SQLOperation.java:256)
at org.apache.hive.service.cli.operation.SQLOperation.access$600(SQLOperation.java:92)
at org.apache.hive.service.cli.operation.SQLOperation$BackgroundWork$1.run(SQLOperation.java:345)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1875)
at org.apache.hive.service.cli.operation.SQLOperation$BackgroundWork.run(SQLOperation.java:357)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
运行作业出现错误,请联系管理员:java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor149.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.dtwave.dipper.spi.plugin.impl.DefaultPluginExecutor.execute(DefaultPluginExecutor.java:26)
at com.dtwave.dipper.executor.proxy.executor.TaskExecutor.execute(TaskExecutor.java:126)
at com.dtwave.dipper.executor.proxy.executor.TaskExecutor.run(TaskExecutor.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.sql.SQLException: Error while processing statement: FAILED: Error in acquiring locks: Locks on the underlying objects cannot be acquired. retry after some time
at org.apache.hive.jdbc.HiveStatement.waitForOperationToComplete(HiveStatement.java:381)
at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:260)
at org.apache.hive.jdbc.HiveStatement.executeUpdate(HiveStatement.java:487)
at com.dtwave.dipper.hive.Hive2TaskRunnerPlugin.handleSql(Hive2TaskRunnerPlugin.java:541)
at com.dtwave.dipper.hive.Hive2TaskRunnerPlugin.normalRun(Hive2TaskRunnerPlugin.java:299)
at com.dtwave.dipper.spi.plugin.runner.SQLTaskRunnerPlugin.doRun(SQLTaskRunnerPlugin.java:68)
at com.dtwave.dipper.spi.plugin.runner.BasicTaskRunnerPlugin.execute(BasicTaskRunnerPlugin.java:88)
... 11 more
作业运行失败(Failed)
引发问题的原因:FAILED: Error in acquiring locks: Locks on the underlying objects cannot be acquired. retry after some time
Hive中有两种锁模式,分别为:共享锁(S)和排它锁(X)。
多个共享锁(S)可以同时获取,排它锁(X)会阻塞其它所有锁。
如果select一张表,这张表则会进入shared模式,增加、插入、删除、修改数据和修改表名等操作都会在shared锁被释放之后再执行,会一直等待。
如果插入、删除、修改数据则进入Exclusive锁模式,进入排他锁模式之后不允许增删改操作,会报错
ERROR : FAILED: Error in acquiring locks: Locks on the underlying objects cannot be acquired. retry after some time org.apache.hadoop.hive.ql.lockmgr.LockException: Locks on the underlying objects cannot be acquired. retry after some time
释放掉Exclusive锁模式即可操作。
采取的措施:在代码里面添加:set hive.support.concurrency=false; 即可
参照:https://blog.youkuaiyun.com/jekongoo/article/details/124998077