Żądania zawieszają się podczas korzystania z klienta Javy Hiveserver2

To jest kolejne pytanie doto pytanie gdzie pytam, co to jest interfejs API klienta Hiveserver 2. To pytanie powinno być w stanie wytrzymać bez tego tła, jeśli nie potrzebujesz więcej kontekstu.

Nie udało mi się znaleźć żadnej dokumentacji dotyczącej korzystania z oszczędnego interfejsu API hiverserver2. Połączyłem to. Najlepszą referencją, jaką mogłem znaleźć, byłaImplementacja 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();

Uruchomię ten kod na instancji Hiverserver2 utworzonej za pomocą

export HIVE_SERVER2_THRIFT_PORT=10002;hive --service hiveserver2

Podczas debugowania nigdy nie przekraczam linii

TOpenSessionResp openResp = client.OpenSession(openReq);

Klient po prostu zawiesza się aż do osiągnięcia limitu czasu i serwer nie zapisuje niczego do stdout lub dzienników. Za pomocą Wireshark widzę segment TCP dla OpenSession () jest wysyłany i ACK'd. Po zabiciu klienta lub przekroczeniu limitu czasu serwer daje mi następujące informacje:

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

Interesujące jest to, że jest to dokładnie ten sam błąd, który otrzymywałem, kiedy przez pomyłkę próbowałem użyć klienta hiveserver (1) przeciwko hiveserver2, co sugeruje, że jeśli chodzi o hiverserver2, mój klient wysyła to śmieci.

Widzę trzy możliwości, w których mogę pójść źle.

1) Moje użycie interfejsu API klienta jest nieprawidłowe. Widziałem, że w implementacji JDBC było trochę rzeczy związanych z uwierzytelnianiem i parametrami połączenia, których nie używam w moim przykładowym kodzie. Grałem z tym, ale strzelałem w ciemności i nie poszedłem dalej.

2) Źle zrobiłem krok konfiguracji. Nie byłem w stanie znaleźć TCLIService w słoiku hive-servive-0.10.0, ale udało mi się go znaleźć w słoiku hive-servive-0.10.0.21 wydanym przez Hortonworks w HDP 1.2, więc być może się tym zajmie ujawnij problem. A może jest coś, czego potrzebuję skonfigurować po stronie serwera, co wyjaśnia, dlaczego mogę połączyć się z rojem za pomocą ODBC, ale nie z moim oszczędnym klientem.

3) Możliwe, że w tym momencie niemożliwe jest napisanie na api klienta hiveserver2. Jest to wiarygodne na podstawie braku dokumentacji i widocznego braku udanych przykładów w Internecie, ale wydaje się, że JDBC to robi. Uważam to za najbardziej nieprawdopodobną opcję.

Nawet jeśli nie znasz poprawki, wiedząc, że poprawka mieści się w granicach 1, 2 lub 3, zawężę moje wyszukiwanie.

questionAnswers(1)

yourAnswerToTheQuestion