3 Stimmen

Wie führe ich einen asynchronen Aufruf an Hive in Java durch?

Ich möchte eine Hive-Abfrage auf dem Server asynchron ausführen. Die Hive-Abfrage wird wahrscheinlich eine lange Zeit in Anspruch nehmen, so dass ich es vorziehen würde, den Aufruf nicht zu blockieren. Ich verwende derzeit Thirft, um einen blockierenden Aufruf zu machen (blockiert bei client.execute()), aber ich habe kein Beispiel dafür gesehen, wie man einen nicht-blockierenden Aufruf macht. Hier ist der blockierende Code:

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

Im obigen Code fehlen try/catch-Blöcke, um ihn kurz zu halten.

Hat jemand eine Idee, wie man einen asynchronen Aufruf zu tun? Kann Hive/Thrift das unterstützen? Gibt es einen besseren Weg?

Merci !

2voto

The D Williams Punkte 96

AFAIK, zum Zeitpunkt der Erstellung dieses Artikels erzeugt Thrift keine asynchronen Clients. Der Grund wird in diesem Link erklärt aquí (Suchtext für "asynchron") ist, dass Thrift für das Rechenzentrum konzipiert wurde, wo eine geringe Latenzzeit vorausgesetzt wird.

Wie Sie wissen, ist die Latenzzeit zwischen Aufruf und Ergebnis nicht immer durch das Netz, sondern durch die ausgeführte Logik bedingt! Wir haben dieses Problem beim Aufruf der Cassandra-Datenbank von einem Java-Anwendungsserver aus, bei dem wir die Anzahl der Threads begrenzen wollen.

Fazit: Im Moment können Sie nur sicherstellen, dass Sie über genügend Ressourcen verfügen, um die erforderliche Anzahl von blockierten, gleichzeitigen Threads zu verarbeiten, und auf eine effizientere Implementierung warten.

2voto

Ishan Punkte 136

Es ist nun möglich, einen asynchronen Aufruf in einem Java-Thrift-Client durchzuführen, nachdem dieser Patch eingefügt wurde: https://issues.apache.org/jira/browse/THRIFT-768

Erzeugen Sie den asynchronen Java-Client unter Verwendung des neuen Thrift und initialisieren Sie Ihren Client wie folgt:

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);

Jetzt können Sie auf diesem Client Methoden wie auf einer synchronen Schnittstelle ausführen. Die einzige Änderung ist, dass alle Methoden einen zusätzlichen Parameter in Form eines Rückrufs erhalten.

1voto

Thilo Punkte 248982

Ich weiß nichts über Hive, aber als letzten Ausweg können Sie die Gleichzeitigkeitsbibliothek von Java verwenden:

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

Wenn Sie nicht auf das Ergebnis warten wollen, können Sie auch Lauffähig anstelle von Abrufbar .

1voto

Peter Sankauskas Punkte 2767

Nach Rücksprache mit der Hive-Mailingliste unterstützt Hive keine asynchronen Aufrufe mit Thirft.

0voto

SyntaxT3rr0r Punkte 26957

Ich weiß nichts über Hive im Besonderen, aber tout blockierende Aufruf kann in einen asynchronen Aufruf umgewandelt werden, indem ein neuer Thread erzeugt und ein Callback verwendet wird. Sie könnten sich java.util.concurrent.FutureTask die für die einfache Handhabung eines solchen asynchronen Betriebs konzipiert wurde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X