2

で作成されたハイブサーバー(1)に接続できました

hive --service hiveserver -v -p 10001

次のJavaを使用します。

TSocket transport = new TSocket("hive.example.com", 10001);     
transport.setTimeout(999999999);
TBinaryProtocol protocol = new TBinaryProtocol(transport);
Client client = new ThriftHive.Client(protocol); 

transport.open();        
client.execute("SHOW TABLES");     
System.out.println(client.fetchOne());
transport.close();

hiveserver2に相当するものはありますか?ある場合、それは何ですか?私が見つけた最高のものはデザインの提案であり、私はまだドキュメントを見つけていません。ClouderaにはここでPython用に何かが設定されているようです

あるいは、Javaから任意のHiveクエリを実行するための最良の方法は何ですか?関連する場合は、Hortonworks DataPlatform1.2で実行しています

4

3 に答える 3

4

サーバープロセスは、クライアントからのSASLハンドシェイクを予期しています(これが、スタックトレースにTSaslServerTransportが表示される理由です)。TSocket接続のラッパーとしてTSaslClientTransportを使用します。また、適切に構成されたSaslClientインスタンスをコンストラクターに渡す必要もあります。または、hive-site.xmlを変更して、SASL認証をオフにすることもできます。

<property><name>hive.server2.authentication</name><value>NOSASL</value></property>
于 2013-04-15T05:13:04.040 に答える
3

HiveClient JDBCインターフェースの使用を検討しましたか?

于 2013-03-12T21:28:50.313 に答える
1

少し検索した後、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を入手したので、それを機能させるための新しい質問をします。私もそれにリンクすることができないので、もしあなたが私のユーザー履歴でフォローアップルックを見たいのなら。

于 2013-03-14T16:18:22.353 に答える