복붙노트

[HADOOP] Hiveserver2 Thrift Java 클라이언트를 사용할 때 요청이 중단됨

HADOOP

Hiveserver2 Thrift Java 클라이언트를 사용할 때 요청이 중단됨

이것은 Hiveserver 2 중고품 Java 클라이언트 API가 무엇인지 묻는이 질문에 대한 후속 질문입니다. 더 이상 문맥이 필요하지 않으면이 질문은 그 배경없이 서서 할 수 있어야합니다.

hiverserver2 중고품을 사용하는 방법에 대한 문서를 찾을 수 없습니다. 내가 찾을 수있는 최고의 참조는 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();

내가 만든 Hiverserver2 인스턴스에 대해이 코드를 실행합니다.

export HIVE_SERVER2_THRIFT_PORT=10002;hive --service hiveserver2

디버깅 할 때 나는 결코 회선을 지나칠 수 없다.

TOpenSessionResp openResp = client.OpenSession(openReq);

클라이언트는 제한 시간에 도달 할 때까지 단순히 멈추고 서버는 stdout이나 로그에 아무 것도 쓰지 않습니다. Wireshark를 사용하면 OpenSession ()에 대한 TCP 세그먼트가 보내지고 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

내가 hiveserver2에 대해 hiveserver (1) 클라이언트를 사용하려고 실수를했을 때와 똑같은 에러라고 생각합니다. hiverserver2에 관한 한 내 클라이언트가 쓰레기를 보내고 있다고합니다.

내가 잘못 될 가능성이있는 세 가지 가능성을 알 수 있습니다.

1) 내 클라이언트 API 사용이 잘못되었습니다. JDBC 구현에서 예제 코드에서 사용하지 않는 인증 및 연결 매개 변수로 진행되는 작업이 있음을 확인했습니다. 나는 그걸 가지고 놀았지만, 어둠 속에서 총격을 가하고 더 이상 얻지 못했습니다.

2) 설정 단계가 잘못되었습니다. hive-servive-0.10.0 jar에서 TCLIService를 찾을 수 없었지만 Hortonworks에서 HDP 1.2로 출시 한 hive-servive-0.10.0.21 jar 파일에서 찾을 수있었습니다. 문제를 드러내십시오. 아니면 ODBC를 사용하여 하이브에 연결할 수있는 이유를 설명하는 서버 측 구성이 필요하지만 저주받은 클라이언트는 필요하지 않을 수도 있습니다.

3)이 시점에서 하이버 서버 2 클라이언트 API에 대해 작성하는 것은 불가능할 수 있습니다. 이것은 설명서의 부족과 인터넷에서의 성공 사례의 명백한 부족으로 볼 때 그럴듯하지만, JDBC는 그렇게 할 것 같습니다. 나는 이것이 가장 희박한 선택이라고 생각한다.

수정 사항을 모르는 경우에도 수정 사항이 1, 2 또는 3에 속하는지 알면 내 검색 범위를 좁히는 데 도움이됩니다.

해결법

  1. ==============================

    1.아직이 문제가 발생했는지는 모르겠지만 동일한 문제에 직면하고이를 해결 했으므로 (더 정확한 설명이 생략되었을 수 있음) 다른 사람이 필요로 할 때를 대비하여 여기에 해결책을 게시합니다.

    아직이 문제가 발생했는지는 모르겠지만 동일한 문제에 직면하고이를 해결 했으므로 (더 정확한 설명이 생략되었을 수 있음) 다른 사람이 필요로 할 때를 대비하여 여기에 해결책을 게시합니다.

    이는 전송 연결을 열 때 중고품 서버가 SASL을 통해 인증 할 것으로 예상하기 때문입니다. 하이브 서버 2는 기본적으로 SASL을 사용합니다 - 불행히도 PHP에는 전송 연결을 열 때 SASL 협상을 처리하는 TSaslClientTransport (다른 TTransport 객체를 래퍼로 사용하는) 버전이 없습니다.

    가장 쉬운 해결책은 hive-site.xml에 다음과 같은 속성을 설정하는 것입니다

    <property><name>hive.server2.authentication</name><value>NOSASL</value></property>
    
  2. from https://stackoverflow.com/questions/15415904/requests-hang-when-using-hiveserver2-thrift-java-client by cc-by-sa and MIT license