少し検索した後、Hortonworks Data Platform 1.2にあるcli_service.thriftを使用して、hiveserver2用のJavathriftサーバーとクライアントを生成することができました。興味のある方は、このtarballで見つけることができます。それを実行して結果のファイルをインポートすると、IDEはHiveserver2クライアントAPIがずっと持っていたjarファイルにあることを知らせてくれました。残念ながら、Apacheハイブjarでそれを見つけることができなかったので、Mavenでは、これをpom.xmlに追加しても完全にはカットされません。
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-service</artifactId>
<version>0.10.0</version>
</dependency>
HDP 1.2リリース用の0.10.0.21バージョンのhive-serverをリポジトリに追加し、代わりにそれを参照しました。次に、HDPの他のいくつかの0.10.0.21ハイブjarを含め、すべての依存関係をpom.xmlに手動で追加しました。このプロセスは私の答えにいくらか接しているので、誰かがそれを求めない限り、これについてこれ以上詳しくは説明しません。
実際にAPIを機能させることはまったく別のことです。thriftによって生成された数十のファイルを調べ、cli_service.thriftを調べ、Apache JDBC実装(Hiveserver2 thrift APIに対して作成するために私が知っている唯一の例)を調べることを組み合わせて、次のコードは、Hiveserver(1)の例をほぼ直接翻訳したものです。
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();
これは、次のコマンドで起動されたHiveserver2サーバーに対して実行されました。
export HIVE_SERVER2_THRIFT_PORT=10002;hive --service hiveserver2
残念ながら、Hiveserver2に対してHiveserver(1)クライアントを実行しようとしたときと同じ動作が発生します。transport.open()
動作しますが、最初の要求(client.OpenSession()
hiveserverの(1)ではなくhiveserver2の場合client.execute()
)がハングします。Wiresharkは、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
誰かがPythonクライアントで同様の問題に遭遇したようです。私はリンクを投稿するという評判がないので、彼らの(未解決の)質問を見たい場合はGooglehiveserver2 thrift client python grokbase
それは機能しないので、これは私の質問に対する部分的な答えにすぎません。ただし、APIを入手したので、それを機能させるための新しい質問をします。私もそれにリンクすることができないので、もしあなたが私のユーザー履歴でフォローアップルックを見たいのなら。