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

私の知る限り、執筆時点では、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();

または、結果を待つ必要がない場合は、 Callableの代わりにRunnableを使用します。

于 2010-02-02T02:11:54.560 に答える
1

Hive メーリング リストに話しかけた後、Hive は Thirft を使用した非同期呼び出しをサポートしません。

于 2010-02-12T23:03:39.717 に答える
0

AWS Elastic MapReduceへの非同期呼び出しを開始します。AWS MapReduce は、AWS MapReduce ウェブ サービスを呼び出して、Amazon のクラウドで Hadoop/Hive ジョブを実行できます。

ジョブのステータスを監視し、ジョブが完了したら S3 から結果を取得することもできます。

Web サービスへの呼び出しは本質的に非同期であるため、他の操作をブロックすることはありません。引き続き別のスレッドでジョブのステータスを監視し、ジョブが完了したら結果を取得します。

于 2010-02-08T19:52:14.243 に答える
0

特にHiveについては知りませんが新しいスレッドを生成してコールバックを使用することにより、ブロッキング呼び出しを非同期呼び出しにすることができます。java.util.concurrent.FutureTaskこのような非同期操作を簡単に処理できるように設計されているものを見ることができます。

于 2010-02-02T02:11:42.470 に答える