2013-03-14 67 views
9

這是對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下面也會幫助縮小搜索範圍。

回答

15

不知道你是否仍然遇到這個問題,但由於我已經面對同樣的問題並解決了它(可能繞過是更準確的描述),我會在這裏發佈一個解決方案,以防萬一別人需要它。

這是因爲當您打開傳輸連接時,節儉服務器期望通過SASL進行身份驗證。 Hive Server 2默認使用SASL--不幸的是,PHP缺少TSaslClientTransport(用作另一個TTransport對象的包裝)版本,該版本在打開傳輸連接時處理SASL協商。

現在最簡單的解決方案是在您的配置單元網站中設置以下屬性。xml

<property><name>hive.server2.authentication</name><value>NOSASL</value></property> 
+0

爲我解決了它。 – 2014-06-27 19:28:58

+0

我得到了。但萬一我必須設置自定義身份驗證,我必須使用PHP連接,那麼在這種情況下什麼是解決方案? – Jaymin 2018-01-16 05:34:12