Запросы зависают при использовании Hiveserver2 Thrift Java client

Это дополнительный вопрос кэтот вопрос где я спрашиваю, что такое Java-клиент Hiveserver 2 thrift. Этот вопрос должен быть в состоянии стоять без этого фона, если вы неТебе не нужно больше контекста.

Невозможно найти какую-либо документацию о том, как использовать API Hiverserver2 Thrift, я собрал это. Лучшая ссылка, которую я мог найти, былаРеализация 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 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();

Я запускаю этот код для экземпляра Hiverserver2, созданного с

export HIVE_SERVER2_THRIFT_PORT=10002;hive --service hiveserver2

При отладке я никогда не переступаю черту

TOpenSessionResp openResp = client.OpenSession(openReq);

Клиент просто зависает, пока не истечет время ожидания, а сервер неничего не пишите в стандартный вывод или логи. Используя Wireshark, я вижу, что TCP-сегмент для OpenSession () отправляется и ACK 'д. После того, как я убил клиента или истекло время ожидания, сервер дает мне следующее:

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

Интересно, что это та же самая ошибка, которую я получал, когда я ошибочно пытался использовать клиент hiveserver (1) против hiveserver2, что говорит о том, что в отношении hiverserver2 мой клиент отправляет это мусор.

Я вижу три варианта того, где я могу ошибаться.

1) Я неправильно использую клиентский API. Я видел, что в реализации JDBC были некоторые вещи, происходящие с параметрами аутентификации и подключения, которые яЯ не использую в моем примере кода. Я играл с этим, но я стрелял в темноте и недальше.

2) Я ошибся в настройке. Я не былЯ не смог найти TCLIService в банке hive-servive-0.10.0, но я смог найти его в банке hive-servive-0.10.0.21, выпущенной Hortonworks в HDP 1.2, так что, возможно, копание с этим выявит проблему , Или, может быть, мне нужно настроить серверную часть, которая объясняет, почему я могу подключиться к кусту, используя ODBC, но не с помощью своего экономичного клиента.

3) Может случиться так, что в этот момент невозможно написать против API клиента hiveserver2. Это правдоподобно из-за отсутствия документации и очевидного отсутствия успешных примеров в Интернете, но JDBC, похоже, делает это. Я считаю это самым маловероятным вариантом.

Даже если ты неЯ не знаю, как исправить ошибку, зная, что исправление подпадает под 1, 2 или 3, поможет сузить поиск.

Ответы на вопрос(1)

Ваш ответ на вопрос