如何在Java中对配置单元进行异步调用?
我希望以异步方式在服务器上执行配置单元查询。配置单元查询可能需要很长时间才能完成,因此我不希望阻止调用。我目前正在使用Thirft进行阻塞调用(blocks on client.execute()),但我还没有看到如何进行非阻塞调用的示例。以下是阻止代码:如何在Java中对配置单元进行异步调用?,java,asynchronous,rpc,thrift,hive,Java,Asynchronous,Rpc,Thrift,Hive,我希望以异步方式在服务器上执行配置单元查询。配置单元查询可能需要很长时间才能完成,因此我不希望阻止调用。我目前正在使用Thirft进行阻塞调用(blocks on client.execute()),但我还没有看到如何进行非阻塞调用的示例。以下是阻止代码: TSocket transport = new TSocket("hive.example.com", 10000); transport.setTimeout(999999999); TBin
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();
tsockettransport=newtsocket(“hive.example.com”,10000);
传输设置超时(999999999);
TBinaryProtocol协议=新的TBinaryProtocol(传输);
客户端=新ThriftHive.Client(协议);
transport.open();
client.execute(hql);//省略HQL
列出行;
而((rows=client.fetchN(1000))!=null){
用于(字符串行:行){
//和row打交道
}
}
transport.close();
上面的代码缺少try/catch块以保持简短
有人知道如何进行异步调用吗?蜂巢/节俭能支持它吗?有更好的办法吗
谢谢 我不知道配置单元的具体情况,但任何阻塞调用都可以通过生成新线程并使用回调在异步调用中进行转换。您可以查看
java.util.concurrent.FutureTask
,它的设计允许轻松处理此类异步操作。我对Hive一无所知,但作为最后手段,您可以使用java的并发库:
Callable<SomeResult> c = new Callable<SomeResult>(){public SomeResult call(){
// your Hive code here
}};
Future<SomeResult> result = executorService.submit(c);
// when you need the result, this will block
result.get();
Callable c=new Callable(){public SomeResult call()){
//你的蜂巢代码在这里
}};
未来结果=执行服务。提交(c);
//当您需要结果时,这将阻止
result.get();
或者,如果您不需要等待结果,请使用Runnable而不是Callable。我们会启动对的异步调用。AWS MapReduce可以通过调用AWS MapReduce web服务在亚马逊的云上运行hadoop/hive作业 您还可以监视作业的状态,并在作业完成后从S3获取结果
由于对web服务的调用本质上是异步的,因此我们从不阻止其他操作。我们继续在单独的线程中监视作业的状态,并在作业完成时获取结果。与Hive邮件列表交谈后,Hive不支持使用Thirtft进行异步调用。AFAIK,在撰写本文时,Thrift不生成异步客户端。此链接中解释的原因(“异步”的搜索文本)是Thrift是为假定延迟较低的数据中心设计的 不幸的是,正如您所知,在调用和结果之间经历的延迟并不总是由网络引起的,而是由正在执行的逻辑引起的!我们从Java应用服务器调用Cassandra数据库时遇到了这个问题,我们希望限制总线程数
小结:现在,您所能做的就是确保您有足够的资源来处理所需数量的阻塞并发线程,并等待更高效的实现。现在可以在安装此修补程序后在Java thrift客户端中进行异步调用: 使用新thrift生成异步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);
现在,您可以像在同步接口上一样在此客户机上执行方法。唯一的变化是,所有方法都采用了一个回调的附加参数。我现在对Thrift不太了解,但是你不能将它包装成一个runnable并创建一个新线程吗?是的,很明显我可以自己做这项工作,但有些事情让我觉得它已经内置到Thrift中,比如TNonblockingSocket。但是我找不到任何关于如何使用它的例子,或者即使Hive支持它。