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

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

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

QueryHandle handle = executeAsyncQuery(hiveQuery);
Status status = handle.checkStatus();
if(status.isCompleted()) {
    QueryResult result = handle.fetchResult();
}

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

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

客户2

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

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

ttisahbt

ttisahbt1#

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

@Override
  public void deleteContext(ServerContext serverContext,
      TProtocol input, TProtocol output) {
    Metrics metrics = MetricsFactory.getInstance();
    if (metrics != null) {
      try {
        metrics.decrementCounter(MetricsConstant.OPEN_CONNECTIONS);
      } catch (Exception e) {
        LOG.warn("Error Reporting JDO operation to Metrics system", e);
      }
    }
    ThriftCLIServerContext context = (ThriftCLIServerContext) serverContext;
    SessionHandle sessionHandle = context.getSessionHandle();
    if (sessionHandle != null) {
      LOG.info("Session disconnected without closing properly, close it now");
      try {
        cliService.closeSession(sessionHandle);
      } catch (HiveSQLException e) {
        LOG.warn("Failed to close session: " + e, e);
      }
    }
  }

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

相关问题