我想以异步方式在服务器上执行配置单元查询。配置单元查询可能需要很长时间才能完成,因此我不希望阻塞调用。我目前正在使用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能支持它吗?有没有更好的方法?
谢谢!
发布于 2010-02-12 23:03:40
在与Hive邮件列表交谈后,Hive不支持使用Thirft的异步调用。
发布于 2010-02-22 16:18:44
AFAIK,在编写本文时,Thrift不生成异步客户端。正如此链接here (搜索“异步”的文本)所解释的原因是,Thrift是为假定延迟较低的数据中心设计的。
不幸的是,正如你所知道的,调用和结果之间的延迟并不总是由网络造成的,而是由执行的逻辑造成的!我们在从Java应用服务器调用Cassandra数据库时遇到了这个问题,我们希望限制总线程数。
摘要:目前,您所能做的就是确保您有足够的资源来处理所需数量的阻塞并发线程,并等待更有效的实现。
发布于 2012-01-10 13:05:39
在安装了这个补丁后,现在可以在Java thrift客户机中进行异步调用了:https://issues.apache.org/jira/browse/THRIFT-768
使用新的thrift生成async java客户端,并按如下方式初始化客户端:
TNonblockingTransport transport = new TNonblockingSocket("127.0.0.1", 9160);
TAsyncClientManager clientManager = new TAsyncClientManager();
TProtocolFactory protocolFactory = new TBinaryProtocol.Factory();
Hive.AsyncClient client = new Hive.AsyncClient(protocolFactory, clientManager, transport);
现在您可以在此客户端上执行方法,就像在同步接口上一样。唯一的变化是所有的方法都有一个额外的回调参数。
https://stackoverflow.com/questions/2181455
复制相似问题