2015-03-04 1 views
0

Я пытаюсь подключиться к Hive Server 2 с 0.12 Thrift сервером из PHP, следуя стандартным примерам, но каждый раз, когда я отправляю запрос с помощью $ client-> execute(), он просто зависает.PHP бережливый клиент для Hive Server 2 зависает

Ниже приведен PHP-код (доменное имя было отредактировано для анонимности) из test.php:

<?php 
$GLOBALS['THRIFT_ROOT'] = '/hadoop/libraries/php-thrift-sql/php'; 
require_once $GLOBALS['THRIFT_ROOT'] . '/TException.php'; 
require_once $GLOBALS['THRIFT_ROOT'] . '/packages/fb303/FacebookService.php'; 
require_once $GLOBALS['THRIFT_ROOT'] . '/packages/hive_metastore/metastore/ThriftHiveMetastore.php'; 
require_once $GLOBALS['THRIFT_ROOT'] . '/packages/hive_service/ThriftHive.php'; 
require_once $GLOBALS['THRIFT_ROOT'] . '/transport/TSocket.php'; 
require_once $GLOBALS['THRIFT_ROOT'] . '/protocol/TProtocol.php'; 
require_once $GLOBALS['THRIFT_ROOT'] . '/protocol/TBinaryProtocol.php'; 
require_once $GLOBALS['THRIFT_ROOT'] . '/../src/Thrift/Type/TType.php'; 
require_once dirname(__FILE__) . '/ThriftHiveClientEx.php'; 

$transport = new TSocket('xxxx.com', 10000); 
$transport->setSendTimeout(600 * 1000); 
$transport->setRecvTimeout(600 * 1000); 
$client = new ThriftHiveClientEx(new TBinaryProtocol($transport)); 
$client->open(); 
$client->execute('SHOW DATABASES'); 
var_dump($client->fetchAll()); 
$client->close(); 

Я думал, что это может быть связано с Hive Server 2 ожидает аутентификации SASL, но Трассирование показывает, что получить застрял после аутентификации и даже установки улья-site.xml с нижеследующим не меняет повешение:
<property><name>hive.server2.authentication</name><value>NOSASL</value></property>

Вот что Трассирование показывает (IP-адрес был отредактирован для анонимности):

$ strace php test.php 
... 
open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 3 
fcntl(3, F_GETFD)      = 0x1 (flags FD_CLOEXEC) 
fstat(3, {st_mode=S_IFREG|0644, st_size=254, ...}) = 0 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b9a30d0d000 
read(3, "127.0.0.1 localhost localhost."..., 4096) = 254 
read(3, "", 4096)      = 0 
close(3)        = 0 
munmap(0x2b9a30d0d000, 4096)   = 0 
gettimeofday({1425502381, 530272}, NULL) = 0 
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3 
fcntl(3, F_GETFL)      = 0x2 (flags O_RDWR) 
fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 
connect(3, {sa_family=AF_INET, sin_port=htons(10000), sin_addr=inet_addr("10.xx.xx.xx")}, 16) = -1 EINPROGRESS (Operation now in progress) 
poll([{fd=3, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 600000) = 1 ([{fd=3, revents=POLLOUT}]) 
getsockopt(3, SOL_SOCKET, SO_ERROR, [247701518558429184], [4]) = 0 
fcntl(3, F_SETFL, O_RDWR)    = 0 
sendto(3, "\200\1\0\1", 4, MSG_DONTWAIT, NULL, 0) = 4 
sendto(3, "\0\0\0\7", 4, MSG_DONTWAIT, NULL, 0) = 4 
sendto(3, "execute", 7, MSG_DONTWAIT, NULL, 0) = 7 
sendto(3, "\0\0\0\0", 4, MSG_DONTWAIT, NULL, 0) = 4 
sendto(3, "\v", 1, MSG_DONTWAIT, NULL, 0) = 1 
sendto(3, "\0\1", 2, MSG_DONTWAIT, NULL, 0) = 2 
sendto(3, "\0\0\0\16", 4, MSG_DONTWAIT, NULL, 0) = 4 
sendto(3, "SHOW DATABASES", 14, MSG_DONTWAIT, NULL, 0) = 14 
sendto(3, "\0", 1, MSG_DONTWAIT, NULL, 0) = 1 
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 600000) = 1 ([{fd=3, revents=POLLIN}]) 
recvfrom(3, "\4\0\0\0\23Invalid status -128", 8192, MSG_DONTWAIT, NULL, NULL) = 24 
mmap(NULL, 67375104, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b9a314e0000 
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 600000 

и через некоторое время (см получать настройки тайм-аута в test.php выше) он раз с

poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 600000) = 1 ([{fd=3, revents=POLLIN}]) 
recvfrom(3, "", 8192, MSG_DONTWAIT, NULL, NULL) = 0 
munmap(0x2af661ac2000, 266240)   = 0 
munmap(0x2af661b44000, 266240)   = 0 
close(2)        = 0 
... 

ответ

0

У нас была такая же проблема, я нашел этот патч, с вопросом в бережливости еще открыт: https://issues.apache.org/jira/browse/THRIFT-2611 Похоже, что в вашем случае revents = POLLIN, в отличие от вышеизложенного. То же самое было для нас. Когда мы делали «lsof -», fd находилось в состоянии CLOSE_WAIT. (т. е. сервер Thrift закрывал соединение)