Я хочу подключиться к hiveserver2 от php-клиента. Тем не менее, я получаю пустую страницу (я должен видеть список таблиц в улье). Я адаптировал код из https://github.com/garamon/php-thrift-hive-client . Вначале я получал эту ошибку TSocket: timed out reading 4 bytes from host
. После внедрения патча, как предлагается здесь, https://stackoverflow.com/a/19199938/4379550 . Ошибка исчезла, но я ничего не получаю. Мой код выглядит следующим образом:
<?php $GLOBALS['THRIFT_ROOT'] = dirname(__FILE__) . '/lib'; require_once $GLOBALS['THRIFT_ROOT'] . '/packages/hive_service/ThriftHive.php'; require_once $GLOBALS['THRIFT_ROOT'] . '/transport/TSocket.php'; require_once $GLOBALS['THRIFT_ROOT'] . '/protocol/TBinaryProtocol.php'; require_once dirname(__FILE__) . '/ThriftHiveClientEx.php'; $transport = new TSocket('hadoop-gate.iis.u-tokyo.ac.jp', 10000); $transport->setSendTimeout(600 * 100); $transport->setRecvTimeout(600 * 100); $client = new ThriftHiveClientEx(new TBinaryProtocol($transport)); $client->open(); //show tables $client->execute('SHOW TABLES'); print_r($client); $tables = $client->fetchAll(); print_r($tables); foreach ($tables as $name){ echo( " found: {$name}\n" ); } ?>
Сообщение об ошибке на сервере, полученном из менеджера cloudera, показано ниже:
6:49:48.859 PM ERROR org.apache.thrift.server.TThreadPoolServer Error occurred during processing of message. java.lang.RuntimeException: org.apache.thrift.transport.TTransportException: Invalid status -128 at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:219) at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:227) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: org.apache.thrift.transport.TTransportException: Invalid status -128 at org.apache.thrift.transport.TSaslTransport.sendAndThrowMessage(TSaslTransport.java:230) at org.apache.thrift.transport.TSaslTransport.receiveSaslMessage(TSaslTransport.java:184) at org.apache.thrift.transport.TSaslServerTransport.handleSaslStartMessage(TSaslServerTransport.java:125) at org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:262) at org.apache.thrift.transport.TSaslServerTransport.open(TSaslServerTransport.java:41) at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:216) ... 4 more
Буду признателен за любую помощь. Спасибо заранее.
Для тех, кто сталкивается с одной и той же проблемой, я решил это, установив свойство NOSASL
в NOSASL
как ранее было NOSASL
здесь . Причина, по которой я не мог сделать это раньше, состоит в том, что я изменял это свойство, перейдя в файл на сервере, и это не сработало, я думаю, потому что я использую распределение cloudera. То, что работало, устанавливало это свойство в менеджере cloudera, как описано в их документации .