Anforderungen hängen, wenn der Hiveserver2 Thrift Java-Client verwendet wird
Dies ist eine Folgefrage zudiese Frage wo ich frage, was die Hiveserver 2 Thrift Java Client API ist. Diese Frage sollte ohne diesen Hintergrund auskommen, wenn Sie keinen weiteren Kontext benötigen.
Ich kann keine Dokumentation zur Verwendung der hiverserver2-Thrift-API finden. Die beste Referenz, die ich finden konnte, war dieApache JDBC-Implementierung.
TSocket transport = new TSocket("hive.example.com", 10002);
transport.setTimeout(999999999);
TBinaryProtocol protocol = new TBinaryProtocol(transport);
TCLIService.Client client = new TCLIService.Client(protocol);
transport.open();
TOpenSessionReq openReq = new TOpenSessionReq();
TOpenSessionResp openResp = client.OpenSession(openReq);
TSessionHandle sessHandle = openResp.getSessionHandle();
TExecuteStatementReq execReq = new TExecuteStatementReq(sessHandle, "SHOW TABLES");
TExecuteStatementResp execResp = client.ExecuteStatement(execReq);
TOperationHandle stmtHandle = execResp.getOperationHandle();
TFetchResultsReq fetchReq = new TFetchResultsReq(stmtHandle, TFetchOrientation.FETCH_FIRST, 1);
TFetchResultsResp resultsResp = client.FetchResults(fetchReq);
TRowSet resultsSet = resultsResp.getResults();
List<TRow> resultRows = resultsSet.getRows();
for(TRow resultRow : resultRows){
resultRow.toString();
}
TCloseOperationReq closeReq = new TCloseOperationReq();
closeReq.setOperationHandle(stmtHandle);
client.CloseOperation(closeReq);
TCloseSessionReq closeConnectionReq = new TCloseSessionReq(sessHandle);
client.CloseSession(closeConnectionReq);
transport.close();
Ich führe diesen Code gegen eine Instanz von Hiverserver2 aus, die mit erstellt wurde
export HIVE_SERVER2_THRIFT_PORT=10002;hive --service hiveserver2
Beim Debuggen komme ich nie über die Grenze
TOpenSessionResp openResp = client.OpenSession(openReq);
Der Client bleibt einfach hängen, bis die Zeitüberschreitung erreicht ist, und der Server schreibt nichts in die Standardausgabe oder die Protokolle. Mit Wireshark kann ich sehen, dass das TCP-Segment für OpenSession () gesendet und bestätigt wird. Sobald ich den Client beendet habe oder das Timeout erreicht ist, gibt mir der Server Folgendes:
13/03/14 11:15:33 ERROR server.TThreadPoolServer: Error occurred during processing of message.
java.lang.RuntimeException: org.apache.thrift.transport.TTransportException: java.net.SocketException: Connection reset
at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:219)
at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:189)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.apache.thrift.transport.TTransportException: java.net.SocketException: Connection reset
at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:129)
at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84)
at org.apache.thrift.transport.TSaslTransport.receiveSaslMessage(TSaslTransport.java:182)
at org.apache.thrift.transport.TSaslServerTransport.handleSaslStartMessage(TSaslServerTransport.java:125)
at org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:253)
at org.apache.thrift.transport.TSaslServerTransport.open(TSaslServerTransport.java:41)
at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:216)
... 4 more
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:127)
... 10 more
Ich finde es interessant, dass dies genau der gleiche Fehler ist, den ich erhalten habe, als ich versehentlich versucht habe, einen hiveserver (1) -Client gegen hiveserver2 zu verwenden, was darauf hindeutet, dass mein Client für hiverserver2 Müll sendet.
Ich sehe drei Möglichkeiten, wo ich falsch liegen könnte.
1) Meine Verwendung der Client-API ist falsch. Ich habe gesehen, dass in der JDBC-Implementierung einige Dinge mit Authentifizierungs- und Verbindungsparametern vor sich gehen, die ich in meinem Beispielcode nicht verwende. Ich habe damit gespielt, aber ich habe im Dunkeln geschossen und bin nicht weiter gekommen.
2) Ich habe einen Setup-Schritt falsch gemacht. Ich konnte TCLIService nicht im hive-servive-0.10.0-Jar finden, aber ich konnte es im hive-servive-0.10.0.21-Jar finden, das von Hortonworks in HDP 1.2 veröffentlicht wurde das Problem offenbaren. Oder es gibt etwas, das ich serverseitig konfigurieren muss, was erklärt, warum ich über ODBC eine Verbindung zum Hive herstellen kann, aber nicht über meinen Thrift-Client.
3) Es könnte sein, dass es zu diesem Zeitpunkt unmöglich ist, gegen die Hiveserver2-Client-API zu schreiben. Dies ist plausibel, da es an Dokumentation mangelt und scheinbar keine erfolgreichen Beispiele im Internet gibt, aber die JDBC scheint dies zu tun. Ich halte das für die unwahrscheinlichste Option.
Selbst wenn Sie keinen Fix kennen, kann die Suche eingegrenzt werden, wenn Sie wissen, ob der Fix unter 1, 2 oder 3 liegt.