代码之家  ›  专栏  ›  技术社区  ›  Peter Sankauskas

如何在Java中对蜂箱进行异步调用?

  •  3
  • Peter Sankauskas  · 技术社区  · 15 年前

    我希望以异步方式在服务器上执行配置单元查询。配置单元查询可能需要很长时间才能完成,因此我不希望在调用时阻塞。我目前正在使用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块以保持简短。

    有人知道如何进行异步调用吗?蜂窝/节俭能支持它吗?有更好的方法吗?

    谢谢!

    6 回复  |  直到 13 年前
        1
  •  2
  •   The D Williams    15 年前

    在写节俭的时候,afaik不会生成异步客户机。此链接中解释的原因 here (搜索文本中的“异步”)是指节俭是为数据中心设计的,该数据中心的延迟假定较低。

    不幸的是,正如您所知,调用和结果之间的延迟并不总是由网络引起的,而是由正在执行的逻辑引起的!这个问题从Java应用服务器调用到CasDANRA数据库,在这里我们要限制总线程。

    总结:目前,您所能做的就是确保您有足够的资源来处理所需数量的阻塞并发线程,并等待更有效的实现。

        2
  •  2
  •   Ishan    13 年前

    现在有可能在这个补丁被放入后,在Java节省客户机中进行异步调用: https://issues.apache.org/jira/browse/THRIFT-768

    使用新的节俭生成异步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);
    

    现在,您可以在这个客户机上执行方法,就像在同步接口上一样。唯一的变化是所有方法都接受回调的附加参数。

        3
  •  1
  •   Thilo    15 年前

    我对蜂巢一无所知,但作为最后一招,你可以使用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();
    

    或者,如果不需要等待结果,请使用 可运行的 而不是 可赎回的 .

        4
  •  1
  •   Peter Sankauskas    15 年前

    在与Hive邮件列表交谈之后,Hive不支持使用Thirft的异步调用。

        5
  •  0
  •   SyntaxT3rr0r    15 年前

    我不知道蜂巢的具体情况,但是 任何 通过生成新线程并使用回调,可以在异步调用中打开阻塞调用。你可以看看 java.util.concurrent.FutureTask 这是为了方便处理这种异步操作而设计的。

        6
  •  0
  •   Deep Kapadia    15 年前

    我们启动异步调用 AWS Elastic MapReduce .通过调用AWS MapReduce Web服务,AWS MapReduce可以在Amazon的云上运行Hadoop/Hive作业。

    您还可以监视作业的状态,并在作业完成后从S3中获取结果。

    由于对Web服务的调用本质上是异步的,因此我们从不阻塞其他操作。我们继续在单独的线程中监视作业的状态,并在作业完成时获取结果。