是否可以在配置单元服务器中异步执行查询?
例如,我怎么可能从客户那里做这样的事情-
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配置为基于时间或其他原因配置此清理过程?
谢谢!
1条答案
按热度按时间ttisahbt1#
做了一些研究,发现这只发生在二进制传输(tcp)中
上面的存根(来自thriftbinarycliservice)通过thriftbinarycliservice使用的tthreadpoolserver的这段代码执行。
eventhandler.deletecontext(connectioncontext、inputprotocol、outputprotocol);
显然,http传输(thrifthttpcliservice)有不同的清理操作句柄的策略(不像tcp那样贪婪)
我们将与Hive社区对此进行检查,以了解更多信息,并查看是否已经存在解决此问题的问题。