gpt4 book ai didi

java - 使用 Hiveserver2 Thrift Java 客户端时请求挂起

转载 作者:可可西里 更新时间:2023-11-01 14:12:33 24 4
gpt4 key购买 nike

这是对 this question 的后续问题我在哪里询问 Hiveserver 2 thrift java 客户端 API 是什么。如果您不需要任何更多上下文,这个问题应该能够在没有该背景的情况下存在。

无法找到有关如何使用 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();

我针对使用

创建的 Hiverserver2 实例运行此代码
export HIVE_SERVER2_THRIFT_PORT=10002;hive --service hiveserver2

在调试的时候,我从不越线

TOpenSessionResp openResp = client.OpenSession(openReq);

客户端只是挂起,直到达到超时,服务器不会向标准输出或日志写入任何内容。使用 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

我发现有趣的是,这与我错误地尝试对 hiveserver2 使用 hiveserver (1) 客户端时收到的错误完全相同,这表明就 hiverserver2 而言,我的客户端正在向它发送垃圾。

我看到了三种可能出错的地方。

1)我对客户端API的使用是错误的。我看到在 JDBC 实现中有一些关于身份验证和连接参数的内容,我没有在我的示例代码中使用这些内容。我尝试了一下,但我在黑暗中射击,没有取得任何进展。

2) 我的一些设置步骤有误。我无法在 hive-servive-0.10.0 jar 中找到 TCLIService,但我能够在 Hortonworks 在 HDP 1.2 中发布的 hive-servive-0.10.0.21 jar 中找到它,所以可能会用它来挖掘揭示问题。或者也许我需要配置服务器端,这解释了为什么我可以使用 ODBC 连接到配置单元,但不能使用我的 thrift 客户端。

3) 可能此时无法针对 hiveserver2 客户端 api 进行编写。基于文档的缺乏和互联网上明显缺乏成功的例子,这是合理的,但 JDBC 似乎做到了。我发现这是最不可能的选择。

即使您不知道修复,知道修复是否低于 1、2 或 3 也有助于缩小我的搜索范围。

最佳答案

不确定您是否仍然遇到这个问题,但由于我遇到了同样的问题并解决了它(也许绕过是更准确的描述),我会在这里发布一个解决方案以防其他人需要它。

这是因为当您打开传输连接时,thrift 服务器希望通过 SASL 进行身份验证。 Hive Server 2 默认使用 SASL - 不幸的是,PHP 缺少一个版本的 TSAslClientTransport(用作另一个 TTransport 对象的包装器),它在您打开传输连接时处理 SASL 协商。

目前最简单的解决方案是在您的 hive-site.xml 中设置以下属性

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

关于java - 使用 Hiveserver2 Thrift Java 客户端时请求挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15415904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com