我想以异步方式在服务器上执行 Hive 查询。 Hive 查询可能需要很长时间才能完成,因此我不想阻止调用。我目前正在使用 Thirft 进行阻塞调用(在 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 块以保持简短。
有谁知道如何进行异步调用? Hive/Thrift 可以支持吗?有没有更好的办法?
Thanks!
AFAIK,在撰写本文时 Thrift 不会生成异步客户端。原因如此链接中所解释here http://jnb.ociweb.com/jnb/jnbJun2009.html(“异步”的搜索文本)是 Thrift 是为假设延迟较低的数据中心而设计的。
不幸的是,正如您所知,调用和结果之间经历的延迟并不总是由网络引起的,而是由正在执行的逻辑引起的!我们从 Java 应用程序服务器调用 Cassandra 数据库时遇到这个问题,我们希望限制总线程数。
摘要:现在您所能做的就是确保您有足够的资源来处理所需数量的阻塞并发线程,并等待更有效的实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)