Les demandes se bloquer lors de l'utilisation de Hiveserver2 Thrift client Java

C'est une question de suivi à cette question où je demande à ce que le Hiveserver 2 thrift client java API est. Cette question devrait être en mesure de tenir la route sans que l'arrière-plan si vous n'avez pas besoin de faire plus de contexte.

Impossible de trouver de la documentation sur la façon d'utiliser le hiverserver2 api d'épargne, j'ai mis cela ensemble. La meilleure référence que j'ai pu trouver a été le Apache JDBC mise en œuvre.

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

J'exécute ce code à l'encontre d'un Hiverserver2 instance créée avec

export HIVE_SERVER2_THRIFT_PORT=10002;hive --service hiveserver2

Lors du débogage, je n'ai jamais passé la ligne

TOpenSessionResp openResp = client.OpenSession(openReq);

Le client se bloque tout simplement jusqu'à ce que le délai est atteint et que le serveur ne rien écrire sur la sortie standard ou les journaux. À l'aide de Wireshark, je peux voir le segment TCP pour OpenSession() est envoyé et ACK. Une fois que je tue le client ou le délai est atteint, le serveur me donne les éléments suivants:

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

Je trouve intéressant le fait que c'est exactement la même erreur que j'ai été reçu quand j'étais à tort d'essayer d'utiliser un hiveserver (1) client contre hiveserver2, ce qui suggère que, dans la mesure hiverserver2 est concerné, mon client est de l'envoyer à ordures.

Je vois trois possibilités pour où je peut mal se passer.

1) Mon utilisation de l'API client est erronée. J'ai vu que dans le JDBC mise en œuvre il y a des choses qui se passent à l'authentification et les paramètres de connexion que je n'utilise pas dans mon code d'exemple. J'ai joué un peu avec ça, mais j'ai été prise de vue dans l'obscurité et ne pas aller plus loin.

2) j'ai eu de l'étape de configuration de mal. Je n'ai pas pu trouver TCLIService dans la ruche-servive-0.10.0 pot, mais j'ai été capable de le trouver dans la ruche-servive-0.10.0.21 pot publié par hortonworks a dans HDP 1.2, alors peut-être creuser autour avec qui va révéler le problème. Ou peut-être il ya quelque chose que j'ai besoin de configurer le serveur de côté ce qui explique pourquoi je peux me connecter à la ruche à l'aide de ODBC, mais pas avec mon épargne du client.

3) Il se pourrait que, à ce stade, il est impossible d'écrire contre la hiveserver2 client api. Cela est plausible fondée sur l'absence de la documentation et de l'absence apparente d'exemples de réussite sur internet, mais le JDBC semble le faire. J'ai trouver, c'est la plus rare option.

Même si vous ne connaissez pas un correctif, de savoir si le correctif tombe sous 1, 2, ou 3 permettrait de réduire ma recherche.

OriginalL'auteur Daniel Koverman | 2013-03-14