這是對this question的後續問題,在這裏我詢問Hiveserver 2 thrift java客戶端API是什麼。如果你不需要更多的上下文,這個問題應該能夠站在沒有背景的情況下。當使用Hiveserver2 Thrift Java客戶端時請求掛起
無法找到任何有關如何使用hiverserver2 thrift api的文檔,我把它放在一起。我能找到的最佳參考是Apache JDBC implementation。
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();
我跑反對與
export HIVE_SERVER2_THRIFT_PORT=10002;hive --service hiveserver2
創建調試時,我從來沒有得到過線
TOpenSessionResp openResp = client.OpenSession(openReq);
客戶只需掛起,直到超時達到和Hiverserver2實例驗證碼服務器不會向stdout或日誌寫入任何內容。使用Wireshark,我可以看到OpenSession()的TCP段被髮送並確認。有一次,我殺了客戶端或達到超時時,服務器對我下面的:
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)我有一些設置步驟錯了。我無法在hive-servive-0.10.0 jar中找到TCLIService,但是我可以在Hortonworks在HDP 1.2中發佈的hive-servive-0.10.0.21 jar中找到它,所以也許可以用它來挖掘它。揭示了這個問題。或者,也許有一些我需要配置服務器端,這就解釋了爲什麼我可以使用ODBC連接到配置單元,而不是使用我的節儉客戶端。
3)可能是在這一點上是不可能寫hiveserver2客戶端API。基於缺乏文檔和互聯網上成功案例的明顯缺乏,這似乎是合理的,但JDBC似乎做到了。我覺得這是最不可能的選擇。
即使您不知道修補程序,知道修補程序是否在1,2或3下面也會幫助縮小搜索範圍。
爲我解決了它。 – 2014-06-27 19:28:58
我得到了。但萬一我必須設置自定義身份驗證,我必須使用PHP連接,那麼在這種情況下什麼是解決方案? – Jaymin 2018-01-16 05:34:12