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檢查時會話超時,是通過創建一個線程來實現的,該設置可以關閉檢查機制,不用創建線程

推薦這個方法

 

 

完工

 

 

運行的任務,任務一直在執行,並沒有阻塞執行,爲什麼會超時,不得而知

留作以後完善

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章