异步配置单元查询执行:一旦查询发起程序客户端断开连接,服务器端的operationhandle就会被清除

1dkrff03  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(529)

是否可以在配置单元服务器中异步执行查询?
例如,我怎么可能从客户那里做这样的事情-

  1. QueryHandle handle = executeAsyncQuery(hiveQuery);
  2. Status status = handle.checkStatus();
  3. if(status.isCompleted()) {
  4. QueryResult result = handle.fetchResult();
  5. }

我还了解了如何在java中对hive进行异步调用?。但没有帮助。答案主要是围绕着节俭的客户提出的一个回调的论点。
任何帮助都将不胜感激。谢谢!
[编辑1]
我查看了hivejdbc中的hiveconnection.java。hivejdbc默认使用异步节约api。因此,它提交一个查询并轮询结果集(查看hivestatement.java)。现在我可以编写一段完全无阻塞的代码了。但问题是一旦客户机断开连接,查询的足迹就丢失了。
客户1

  1. final TCLIService.Client client = new TCLIService.Client(createBinaryTransport(host, port, loginTimeout, sessConf, false)); // from HiveConnection.java
  2. TSessionHandle sessionHandle = openSession(client) // from HiveConnection.java
  3. TExecuteStatementReq execReq = new TExecuteStatementReq(sessionHandle, sql);
  4. execReq.setRunAsync(true);
  5. execReq.setConfOverlay(sessConf);
  6. final TGetOperationStatusReq handle = client.ExecuteStatement(execReq)
  7. writeHandleToFile("~/handle", handle)

客户2

  1. final TGetOperationStatusReq handle = readHandleFromFile("~/handle")
  2. final TCLIService.Client client = new TCLIService.Client(createBinaryTransport(host, port, loginTimeout, sessConf, false));
  3. while (true) {
  4. System.out.println(client.GetOperationStatus(handle).getOperationState());
  5. Thread.sleep(1000);
  6. }

只要客户机1处于活动状态,客户机2就会保持打印完成的状态。但是,如果客户机1进程完成或被终止,客户机2将开始打印null,这意味着一旦客户机断开连接,hiveserver2就会清理资源。
是否可以将hiveserver2配置为基于时间或其他原因配置此清理过程?
谢谢!

ttisahbt

ttisahbt1#

做了一些研究,发现这只发生在二进制传输(tcp)中

  1. @Override
  2. public void deleteContext(ServerContext serverContext,
  3. TProtocol input, TProtocol output) {
  4. Metrics metrics = MetricsFactory.getInstance();
  5. if (metrics != null) {
  6. try {
  7. metrics.decrementCounter(MetricsConstant.OPEN_CONNECTIONS);
  8. } catch (Exception e) {
  9. LOG.warn("Error Reporting JDO operation to Metrics system", e);
  10. }
  11. }
  12. ThriftCLIServerContext context = (ThriftCLIServerContext) serverContext;
  13. SessionHandle sessionHandle = context.getSessionHandle();
  14. if (sessionHandle != null) {
  15. LOG.info("Session disconnected without closing properly, close it now");
  16. try {
  17. cliService.closeSession(sessionHandle);
  18. } catch (HiveSQLException e) {
  19. LOG.warn("Failed to close session: " + e, e);
  20. }
  21. }
  22. }

上面的存根(来自thriftbinarycliservice)通过thriftbinarycliservice使用的tthreadpoolserver的这段代码执行。
eventhandler.deletecontext(connectioncontext、inputprotocol、outputprotocol);
显然,http传输(thrifthttpcliservice)有不同的清理操作句柄的策略(不像tcp那样贪婪)
我们将与Hive社区对此进行检查,以了解更多信息,并查看是否已经存在解决此问题的问题。

展开查看全部

相关问题