[HADOOP] Hiveserver2 Thrift Java 클라이언트를 사용할 때 요청이 중단됨
HADOOPHiveserver2 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.아직이 문제가 발생했는지는 모르겠지만 동일한 문제에 직면하고이를 해결 했으므로 (더 정확한 설명이 생략되었을 수 있음) 다른 사람이 필요로 할 때를 대비하여 여기에 해결책을 게시합니다.
아직이 문제가 발생했는지는 모르겠지만 동일한 문제에 직면하고이를 해결 했으므로 (더 정확한 설명이 생략되었을 수 있음) 다른 사람이 필요로 할 때를 대비하여 여기에 해결책을 게시합니다.
이는 전송 연결을 열 때 중고품 서버가 SASL을 통해 인증 할 것으로 예상하기 때문입니다. 하이브 서버 2는 기본적으로 SASL을 사용합니다 - 불행히도 PHP에는 전송 연결을 열 때 SASL 협상을 처리하는 TSaslClientTransport (다른 TTransport 객체를 래퍼로 사용하는) 버전이 없습니다.
가장 쉬운 해결책은 hive-site.xml에 다음과 같은 속성을 설정하는 것입니다
<property><name>hive.server2.authentication</name><value>NOSASL</value></property>
from https://stackoverflow.com/questions/15415904/requests-hang-when-using-hiveserver2-thrift-java-client by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] MapReduce 셔플 / 정렬 방법 (0) | 2019.06.04 |
---|---|
[HADOOP] Spark + 스칼라 변환, 불변성 및 메모리 소비 간접비 (0) | 2019.06.04 |
[HADOOP] HDFS에서 N 일보다 오래된 디렉토리 찾기 (0) | 2019.06.04 |
[HADOOP] Hadoop Writable과 java.io.serialization의 연결 및 차이점은 무엇입니까? (0) | 2019.06.04 |
[HADOOP] 일식에서 mapreduce 일을 시작하십시오 (0) | 2019.06.04 |