3

我想以异步方式在服务器上执行 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 可以支持吗?有没有更好的办法?

谢谢!

4

6 回答 6

2

AFAIK,在撰写本文时,Thrift 不会生成异步客户端。此处链接中解释的原因(搜索“异步”文本)是 Thrift 是为假设延迟较低的数据中心设计的。

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

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

于 2010-02-22T16:18:43.717 回答
2

现在可以在安装此补丁后在 Java thrift 客户端中进行异步调用: https ://issues.apache.org/jira/browse/THRIFT-768

使用新的 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);

现在,您可以像在同步接口上一样在此客户端上执行方法。唯一的变化是所有方法都采用了一个额外的回调参数。

于 2012-01-10T13:05:38.553 回答
1

我对 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();

或者,如果您不需要等待结果,请使用Runnable而不是Callable

于 2010-02-02T02:11:54.560 回答
1

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

于 2010-02-12T23:03:39.717 回答
0

我不特别了解 Hive,但任何阻塞调用都可以通过生成一个新线程并使用回调来在异步调用中打开。您可以查看java.util.concurrent.FutureTask哪些设计允许轻松处理此类异步操作。

于 2010-02-02T02:11:42.470 回答
0

我们触发对AWS Elastic MapReduce的异步调用。AWS MapReduce 可以通过调用 AWS MapReduce Web 服务在 Amazon 的云上运行 hadoop/hive 作业。

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

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

于 2010-02-08T19:52:14.243 回答