一个奇怪的问题
有个任务报错如下
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即可,该变量的值来源于一个参数,如下设置即可
<property>
<name>hive.server2.idle.session.timeout</name>
<value>0</value>
</property>
再看else分支,也会关闭超时的操作,继续深入看源码
可以看到如果operationTimeout设置为0,则不再判断超时,设置如下
<property>
<name>hive.server2.idle.operation.timeout</name>
<value>0</value>
</property>
如上即可完成操作
继续查看代码,如何启动超时检查
这里只有当checkInterval > 0 时才检查, 该变量也是对应一个参数,原以为可以设置如下
<property>
<name>hive.server2.session.check.interval</name>
<value>0</value>
</property>
结果发现,在HiveConf中定义该字段的最小值3000msec,不可以这样设置,这个办法行不通
总结: 这三个参数默认值是 0 ,也就是不启用该检查功能。所以只有配置了该参数的集群才有可能遇到这个问题
还要注意的是这三个参数是服务端参数,session中通过set设置并不生效,但是不会报错,需要在hive-site.xml中设置,然后重启
完工
运行的任务,任务一直在执行,并没有阻塞执行,为什么会超时,不得而知
留作以后完善