4

我正在尝试通过 PHP 中的 Hive/Thrift 查询数据库。但是,我不断收到错误消息:

TSocket: timed out reading 4 bytes from XYZ

我正在使用来自的代码

https://cwiki.apache.org/Hive/hiveclient.html#HiveClient-PHP

连同这个 PHP Thrift Client

https://github.com/garamon/php-thrift-hive-client

我的代码:

<?php

$socket    = new TSocket( 'XYZ', 12345 );

$socket->setSendTimeout(30 * 1000);
$socket->setRecvTimeout(30 * 1000);

$transport = new TBufferedTransport( $socket, 1024, 1024 );
$protocol  = new TBinaryProtocol( $transport );

$client    = new ThriftHiveClientEx( $protocol );

$transport->open();

$client->execute("my query");

?>

注意 - 我可以通过控制台(telnet 命令)与 XYZ 连接。

我会给予任何帮助。谢谢。

4

1 回答 1

2

从那些完全相同的资源开始时,我遇到了类似的问题。事实证明,代码无法识别它是否已超时或是否阻塞了端口。我发现这篇文章对我有帮助:

https://issues.apache.org/jira/browse/THRIFT-347

在您的 TSocket.php 代码 (garamon_base_dir/lib/transport) 中,您必须编辑大约 223 到 236 行。

它在哪里说:

if( $buf === FALSE || $buf === '' ) { ...
and
if( $md['timed_out'] ) { ...
and then again
if( $md[timed_out'] ) { ...

更改为(分别):

if( $buf === FALSE ) { ...
and
if( true === $md['timed_out'] && false === $md['blocked'] )
and finally 
if( true === $md['timed_out'] && false === $md['blocked'] )

然后它在此修复后开始工作。祝你好运!

于 2013-10-05T16:21:33.090 回答