一個奇怪的問題
有個任務報錯如下
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檢查時會話超時,是通過創建一個線程來實現的,該設置可以關閉檢查機制,不用創建線程
推薦這個方法
完工
運行的任務,任務一直在執行,並沒有阻塞執行,爲什麼會超時,不得而知
留作以後完善