2014-11-26 6 views
2

Предположим, что Hive установлен в кластере «g». У меня нет доступа к Золотому кластеру. Я занимаюсь разработкой python в кластере s. Я могу получить доступ к Hive из кластера «s» и запускать запросы.Python Hive: thrift.transport.TTransport.TTransportException: None

У меня есть нижний код для подключения к Hive из скрипта Python, работающего в кластере s.

some_table - таблица, которая уже существует в улье. Я хотел бы выполнить простую команду select * from some_table, чтобы получить некоторые результаты.

import sys 
sys.path.append("/usr/lib/hive/lib/py") 

from hive_service import ThriftHive 
from hive_service.ttypes import HiveServerException 
from thrift import Thrift 
from thrift.transport import TSocket 
from thrift.transport import TTransport 
from thrift.protocol import TBinaryProtocol 


transport = TSocket.TSocket('what-ever-server', what-ever-port) 
transport = TTransport.TBufferedTransport(transport) 
protocol = TBinaryProtocol.TBinaryProtocol(transport) 

client = ThriftHive.Client(protocol) 
transport.open() 
print "connect success" 
client.execute("SELECT * FROM some_table") 
print client.fetchAll() 
print "executed" 

Но я получаю следующую ошибку после печати «connect success». Я предполагаю, что соединение было успешным.

Traceback (most recent call last): 
    File "hiveConnect.py", line 30, in <module> 
     row = client.execute("SELECT * FROM some_table") 
    File "/usr/lib/hive/lib/py/hive_service/ThriftHive.py", line 68, in execute 
     self.recv_execute() 
    File "/usr/lib/hive/lib/py/hive_service/ThriftHive.py", line 79, in recv_execute 
     (fname, mtype, rseqid) = self._iprot.readMessageBegin() 
    File "/usr/lib/hive/lib/py/thrift/protocol/TBinaryProtocol.py", line 137, in readMessageBegin 
     name = self.trans.readAll(sz) 
    File "/usr/lib/hive/lib/py/thrift/transport/TTransport.py", line 58, in readAll 
     chunk = self.read(sz-have) 
    File "/usr/lib/hive/lib/py/thrift/transport/TTransport.py", line 155, in read 
     self.__rbuf = StringIO(self.__trans.read(max(sz, self.DEFAULT_BUFFER))) 
    File "/usr/lib/hive/lib/py/thrift/transport/TSocket.py", line 94, in read 
     raise TTransportException('TSocket read 0 bytes') 
thrift.transport.TTransport.TTransportException: None 

Что я делаю неправильно в этом коде? Я не испытываю никакой ошибки при подключении к Hive с использованием имени сервера и порта, поэтому я предполагаю, что все в порядке и что соединение с Hive не является проблемой. Любая помощь приветствуется.

ответ

1

Ну, после нескольких исследований я обнаружил, что на самом деле это был HiveServer2, который использовался с номером порта в 10 000. После этого мне пришлось установить pyhs2, чтобы он работал правильно.

Смежные вопросы