我想以异步方式在服务器上执行 Hive 查询。 Hive 查询可能需要很长时间才能完成,所以我不想阻塞调用。我目前正在使用 Thirft 进行阻塞调用(blocks on client.execute()),但我还没有看到如何进行非阻塞调用的示例。这是阻止代码:
TSocket transport = new TSocket("hive.example.com", 10000);
transport.setTimeout(999999999);
TBinaryProtocol protocol = new TBinaryProtocol(transport);
Client client = new ThriftHive.Client(protocol);
transport.open();
client.execute(hql); // Omitted HQL
List<String> rows;
while ((rows = client.fetchN(1000)) != null) {
for (String row : rows) {
// Do stuff with row
}
}
transport.close();
上面的代码缺少 try/catch block 以保持简短。
有没有人知道如何进行异步调用? Hive/Thrift 可以支持吗?有没有更好的办法?
谢谢!
最佳答案
据我所知,在撰写本文时 Thrift 不会生成异步客户端。此链接中解释的原因 here (“异步”的搜索文本)是 Thrift 是为假定延迟较低的数据中心设计的。
不幸的是,如您所知,调用和结果之间的延迟并不总是由网络引起,而是由正在执行的逻辑引起!我们在从 Java 应用程序服务器调用 Cassandra 数据库时遇到了这个问题,我们希望限制总线程数。
总结:目前您所能做的就是确保您有足够的资源来处理所需数量的阻塞并发线程,并等待更高效的实现。
关于java - 如何在 Java 中对 Hive 进行异步调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2181455/