这是该问题的后续问题,在这里我问什么是Hiveserver
2旧版Java客户端API。如果您不需要更多背景信息,那么这个问题应该能够在没有背景的情况下得以解决。
找不到有关如何使用hiverserver2旧版api的任何文档,我将它们放在一起。我能找到的最佳参考是Apache
JDBC实现
。
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);
客户端只是挂起,直到达到超时并且服务器不向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
我发现有趣的是,这与我错误地尝试对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客户端连接到Hive。
3)可能此时无法针对hiveserver2客户端api进行编写。基于缺乏文档和互联网上显然没有成功的例子,这是合理的,但是JDBC似乎做到了。我发现这是最不可能的选择。
即使您不知道修复程序,知道该修复程序是否低于1、2或3也将有助于缩小搜索范围。
不知道您是否仍然遇到此问题,但是由于我遇到了相同的问题并已解决(也许绕过的是更准确的描述),因此我将在此处发布解决方案,以防万一其他人需要它。
这是因为当您打开传输连接时,旧服务器希望通过SASL进行身份验证。Hive Server 2默认使用SASL-
不幸的是,PHP缺少TSaslClientTransport版本(用作另一个TTransport对象的包装),该版本在打开传输连接时处理SASL协商。
目前最简单的解决方案是在hive-site.xml中设置以下属性
<property><name>hive.server2.authentication</name><value>NOSASL</value></property>
客户端的HTTP/HTTPS请求。 进程:主进程 ClientRequest是由EventEmitter来实现Writable Stream new ClientRequest(options) 作用:发起新的HTTP/HTTPS请求 options(Object | String) - options是String时即请求URL。 options 是Object时则按以下属性请求: meth
httplib 库主要用来模拟客户端发送 HTTP 请求,类似于 Curl 工具,支持 JQuery 类似的链式操作。使用起来相当的方便;通过如下方式进行安装: go get github.com/astaxie/beego/httplib 如何使用 首先导入包 import ( "github.com/astaxie/beego/httplib" ) 然后初始化请求方法,返回对象 r
当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信息头的一部分来传送的。您可以查阅HTTP协议来获得更多的信息。 下表列出了浏览器端信息头的一些重要内容,在以后的网络编程中将会经常见到这些信息: 信息 描述 Accept 指定浏览器或其他客户端可以处理的MIME类型。它的值通常为 image/png 或 image/jpeg Accept-Char
如何在基于网络的 HTTP 客户端中重试 HTTP 请求? 请考虑以下处理程序,如果收到 HTTP 响应代码 503,它将尝试在 1 秒后重试 HTTP 请求: 在本例中,当我写入通道时,管道中的其他处理程序会看到HttpObjects,但实际上不会再次执行HttpRequest——只接收到一个HttpResponse。 我认为在这种情况下我只是滥用了 Channel,我需要创建一个新的通道(表示
我是WebClient字段的新手,但我遇到了以下问题。这是我的客户端方法,您已经看到它应该插入我发送到数据库参数的值,但我无法插入它。 我在这里写的代码是我的控制器区域。 当我运行我的方法时,我无法将值添加到服务器端的数据库中,但我可以使用以下使用客户端方法的方法从那里获取值。
同步-向API发出一批请求,并定期将响应保存到我的数据库。 客户端-从我的客户端的用户向API请求的传递。 服务的文档指定了在给定时间段内可以发出的最大请求数的以下规则: 在一天中: null null 超过这些限制不会导致立即锁定-不会抛出任何异常。但供应商可能会感到恼火,联系我们,然后禁止我们使用他的服务。因此,我需要有一些请求延迟机制,在适当的地方,以防止这一点。我是这样看的: 最安全和最简