Solicitações interrompem ao usar o cliente Hiveserver2 Thrift Java

Esta é uma pergunta de acompanhamentoessa questão onde eu pergunto o que é o Hiveserver 2 thrift java client API. Esta questão deve ser capaz de se manter sem esse histórico se você não precisar de mais contexto.

Incapaz de encontrar qualquer documentação sobre como usar o hiverserver2 thrift api, eu coloquei isso junto. A melhor referência que pude encontrar foi aImplementação do 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();

Eu executo este código em uma instância do Hiverserver2 criada com

export HIVE_SERVER2_THRIFT_PORT=10002;hive --service hiveserver2

Ao depurar, nunca ultrapasse a linha

TOpenSessionResp openResp = client.OpenSession(openReq);

O cliente simplesmente trava até que o tempo limite seja atingido e o servidor não escreve nada no stdout ou nos logs. Usando o Wireshark, posso ver o segmento TCP para OpenSession () ser enviado e ACK'd. Uma vez que eu mato o cliente ou o tempo limite é atingido, o servidor me dá o seguinte:

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

Eu acho interessante que este é exatamente o mesmo erro que eu estava recebendo quando eu estava erroneamente tentando usar um cliente hiveserver (1) contra o hiveserver2, o que sugere que, no que diz respeito ao hiverserver2, meu cliente está enviando lixo para ele.

Eu vejo três possibilidades para onde eu posso estar errado.

1) Meu uso da API do cliente está errado. Eu vi que na implementação do JDBC havia algumas coisas acontecendo com parâmetros de autenticação e conexão que eu não estou usando no meu código de exemplo. Brinquei com isso, mas estava fotografando no escuro e não consegui mais nada.

2) Eu tenho algum passo de configuração errado. Eu não consegui encontrar o TCLIService no jar-hive-servive-0.10.0, mas eu consegui encontrá-lo no jar-hive-servive-0.10.0.21 lançado pela Hortonworks no HDP 1.2, então talvez cavar com isso revelar o problema. Ou talvez haja algo que eu preciso configurar do lado do servidor, o que explica porque eu posso conectar-me ao ramo usando o ODBC, mas não com o meu cliente thrift.

3) Pode ser que neste ponto seja impossível escrever na API do cliente hiveserver2. Isso é plausível com base na falta de documentação e na aparente falta de exemplos de sucesso na Internet, mas o JDBC parece fazê-lo. Eu acho isso a opção mais improvável.

Mesmo que você não saiba uma correção, saber se a correção é menor que 1, 2 ou 3 ajudaria a restringir minha pesquisa.