Hiveserver2 Java API

时间:2013-03-12 21:21:39

标签: java hadoop hive thrift hortonworks-data-platform

我已经能够连接到使用

创建的hiveserver(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是否存在等价物,如果存在,它是什么?我找到的最好的是design proposal,我还没有找到任何文档。看起来Cloudera为python here

设置了一些东西

或者,从Java运行任意Hive查询的最佳方法是什么?如果它是相关的,我正在运行Hortonworks Data Platform 1.2

3 个答案:

答案 0 :(得分:4)

服务器进程期望来自客户端的SASL握手(这就是为什么你可以在堆栈跟踪中看到TSaslServerTransport)。使用TSaslClientTransport作为TSocket连接的包装器 - 您还需要将适当配置的SaslClient实例传递给构造函数。或者,您可以修改hive-site.xml以关闭SASL身份验证。

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

答案 1 :(得分:3)

您是否考虑过使用HiveClient JDBC interface?

答案 2 :(得分:1)

经过一些搜索后,我设法使用Hortonworks Data Platform 1.2中的cli_service.thrift为hiveserver 2生成Java thrift服务器和客户端。如果有人有兴趣,您可以在this tarball找到它。一旦我这样做并导入了生成的文件,我的IDE让我知道Hiveserver2客户端API在我一直以来的罐子里。不幸的是,我无法在Apache蜂巢罐中找到它,所以在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添加到我的存储库并改为引用它。然后我手动将所有依赖项添加到我的pom.xml中,包括来自HDP的其他几个0.10.0.21 hive jar。由于这个过程与我的回答有些相似,除非有人要求,否则我不会详细介绍这个过程。

实际上让API工作完全是另一回事。通过结合使用thrift生成的几十个文件,查看cli_service.thrift,并查看Apache JDBC implementation(这是我所知道的针对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()有效,但第一个请求(在hiverserver2的情况下client.OpenSession()而不是hiveserver的(1)client.execute())挂起。 Wireshark显示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

有人似乎遇到了与Python客户端类似的问题。我没有发布链接的声誉,所以如果你想看到他们(未解决的)问题Google hiveserver2 thrift client python grokbase

由于它不起作用,这只是我问题的部分答案。但是,现在我有了API,我将提出一个新的问题,让它工作。我也无法链接到那个,所以如果你想看到跟进,请查看我的用户历史记录。