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()

这个是检查超时的机制,源代码如下

Hive任务超时报错 Invalid OperationHandle

可以看到if条件,当sessionTimeout > 0 时,如果真的是长时间session没有访问,就会执行closeSession方法

也就是如果不想执行该方法, 只需要把sessionTimeout设置为0即可,该变量的值来源于一个参数,如下设置即可

set hive.server2.idle.session.timeout=0;

 

再看else分支,也会关闭超时的操作,继续深入看源码

Hive任务超时报错 Invalid OperationHandle

可以看到如果operationTimeout设置为0,则不再判断超时,设置如下

set hive.server2.idle.operation.timeout=0;

如上即可完成操作

 

推荐另外一个更简单的方法

Hive任务超时报错 Invalid OperationHandle

这里只有当checkInterval > 0 时才检查, 该变量也是对应一个参数,设置如下

set hive.server2.session.check.interval=0;

SessionManager检查时会话超时,是通过创建一个线程来实现的,该设置可以关闭检查机制,不用创建线程

推荐这个方法

 

 

完工

 

 

运行的任务,任务一直在执行,并没有阻塞执行,为什么会超时,不得而知

留作以后完善