Hive任务超时报错 Invalid OperationHandle
一个奇怪的问题
有个任务报错如下
Invalid OperationHandle: OperationHandle [opType=EXECUTE_STATEMENT, getHandleIdentifier()=373ae075-499f-4ccf-a75b-43152be71c67]
查看hiveserver2的日志
2020-04-28 06:06:50,413 WARN org.apache.hive.service.CompositeService: [HiveServer2-Background-Pool: Thread-24]: Session SessionHandle [a666e7
d3-351a-484c-bfc2-cddc62b64706] is Timed-out (last access : Tue Apr 28 04:03:35 CST 2020) and will be closed
2020-04-28 06:06:50,413 INFO org.apache.hive.service.CompositeService: [HiveServer2-Background-Pool: Thread-24]: Session closed, SessionHandle
[a666e7d3-351a-484c-bfc2-cddc62b64706], current sessions:2
2020-04-28 06:06:50,414 INFO org.apache.hive.service.cli.operation.OperationManager: [HiveServer2-Background-Pool: Thread-24]: Closing operati
on: OperationHandle [opType=EXECUTE_STATEMENT, getHandleIdentifier()=373ae075-499f-4ccf-a75b-43152be71c67]
2020-04-28 06:06:50,415 INFO org.apache.hive.service.cli.operation.Operation: [HiveServer2-Background-Pool: Thread-24]: The running operation
has been successfully interrupted: hive_20200428040303_4785a04b-7f82-42c7-8efa-06f08442b33e
2020-04-28 06:06:50,416 WARN org.apache.hadoop.hive.ql.Driver: [HiveServer2-Background-Pool: Thread-24]: Shutting down task : Stage-14:MAPRED
2020-04-28 06:06:50,418 WARN org.apache.hadoop.ipc.Client: [HiveServer2-Background-Pool: Thread-1315819]: interrupted waiting to send rpc requ
est to server
java.lang.InterruptedException
可以看到,是由于Session SessionHandle 超时了,然后关闭了 OperationHandle , 后面再操作这个OperationHandle时,就报无效的错误了
关键就是Session为什么会超时!!!
beeline控制台,任务运行好几个小时,都不会超时退出
但是jdbc连接提交的任务,运行一个小时不到就超时退出了,主要是提供两种方式提供的服务不同,就是提供服务的类不同
1. beeline对应的服务类: org.apache.hive.service.cli.CLIService
2. jdbc 对应的服务类: org.apache.hive.service.cli.session.SessionManager
SessionManager这个类是以会话形式对外提供服务,jdbc和hive on spark都是基于这个服务
两个类都是继承自:org.apache.hive.service.CompositeService
查看SessionManager类, 发现多了一个方法
private void startTimeoutChecker()
这个是检查超时的机制,源代码如下
可以看到if条件,当sessionTimeout > 0 时,如果真的是长时间session没有访问,就会执行closeSession方法
也就是如果不想执行该方法, 只需要把sessionTimeout设置为0即可,该变量的值来源于一个参数,如下设置即可
set hive.server2.idle.session.timeout=0;
再看else分支,也会关闭超时的操作,继续深入看源码
可以看到如果operationTimeout设置为0,则不再判断超时,设置如下
set hive.server2.idle.operation.timeout=0;
如上即可完成操作
推荐另外一个更简单的方法
这里只有当checkInterval > 0 时才检查, 该变量也是对应一个参数,设置如下
set hive.server2.session.check.interval=0;
SessionManager检查时会话超时,是通过创建一个线程来实现的,该设置可以关闭检查机制,不用创建线程
推荐这个方法
完工
运行的任务,任务一直在执行,并没有阻塞执行,为什么会超时,不得而知
留作以后完善