Las solicitudes se bloquean al utilizar el cliente Hifterver2 Thrift Java

Esta es una pregunta de seguimiento paraesta pregunta donde pregunto cuál es la API del cliente java de Hiveserver 2 thrift. Esta pregunta debería ser capaz de permanecer sin ese fondo si no necesita más contexto.

No se puede encontrar ninguna documentación sobre cómo utilizar la API de ahorro hiverserver2, puse esto juntos. La mejor referencia que pude encontrar fue laImplementacion Apache JDBC.

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

Ejecuto este código contra una instancia de Hiverserver2 creada con

export HIVE_SERVER2_THRIFT_PORT=10002;hive --service hiveserver2

Al depurar, nunca paso la línea

TOpenSessionResp openResp = client.OpenSession(openReq);

El cliente simplemente se bloquea hasta que se alcanza el tiempo de espera y el servidor no escribe nada en la salida estándar o los registros. Usando Wireshark, puedo ver que el segmento TCP para OpenSession () se envía y ACK'd. Una vez que mato al cliente o se alcanza el tiempo de espera, el servidor me ofrece lo siguiente:

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

Me parece interesante que este es exactamente el mismo error que recibía cuando intentaba usar un cliente hiveserver (1) contra hiveserver2, lo que sugiere que, en lo que respecta a hiverserver2, mi cliente está enviando basura.

Veo tres posibilidades para lo que podría estar yendo mal.

1) Mi uso de la API del cliente es incorrecto. Vi que en la implementación de JDBC había algunas cosas con la autenticación y los parámetros de conexión que no estoy usando en mi código de ejemplo. Jugué un poco con eso, pero estaba disparando en la oscuridad y no conseguí más.

2) Tengo un paso de configuración mal. No pude encontrar TCLIService en el tarro hive-servive-0.10.0, pero pude encontrarlo en el tarro hive-servive-0.10.0.21 lanzado por Hortonworks en HDP 1.2, así que tal vez escarbando con esa voluntad Revelar el tema. O tal vez hay algo que necesito configurar del lado del servidor que explique por qué puedo conectarme a Hive utilizando el ODBC pero no con mi cliente de segunda mano.

3) Podría ser que en este punto es imposible escribir contra la API del cliente hiveserver2. Esto es plausible basado en la falta de documentación y la aparente falta de ejemplos exitosos en Internet, pero el JDBC parece hacerlo. Me parece que esta es la opción más improbable.

Incluso si no sabe una solución, saber si la solución cae en 1, 2 o 3 ayudaría a limitar mi búsqueda.

Respuestas a la pregunta(1)

Su respuesta a la pregunta