После нескольких дней работы над этим ответ на мой вопрос следующий:
import happybase
CDH6_HBASE_THRIFT_VER='0.92'
hbase_cnxn = happybase.Connection(
host='vps00', port=9090,
table_prefix=None,
compat=CDH6_HBASE_THRIFT_VER,
table_prefix_separator=b'_',
timeout=None,
autoconnect=True,
transport='framed', # Default: 'buffered' <---- Changed.
protocol='compact' # Default: 'binary' <---- Changed.
)
print('tables:', hbase_cnxn.tables()) # Works. Output: [b'ns1:mytable', ]
Обратите внимание, что, хотя эти вопросы и ответы были сформулированы в контексте Cloudera
, получается (каквы увидите), что это были Thrift
версии и Thrift
конфигурации на стороне сервера, и поэтому это относится и к Hortonworks
и MapR
пользователям.
Пояснение :
В Cloudera CDH v6.1.x
(и, возможно, в будущих версиях), если вы посетите раздел Hbase Thrift Server Configuration
его интерфейса управления, вы найдете среди многих других параметров следующие параметры:
Обратите внимание, что compact protocol
и framed transport
включены;таким образом, они должны были быть изменены в happybase
по умолчанию (которые я показываю выше).
Как уже упоминалось в EDIT после моего первоначального вопроса, я также исследовал чистыйThrift
(не happybase
) решение.И с аналогичными изменениями в коде Python для этого случая, я получил это, чтобы работать тоже.Вот код, который вы должны использовать для чистого решения Thrift
(внимательно прочитайте мои комментарии ниже):
from thrift.protocol import TCompactProtocol # Notice the import: TCompactProtocol [!]
from thrift.transport.TTransport import TFramedTransport # Notice the import: TFramedTransport [!]
from thrift.transport import TSocket
from hbase import Hbase
# -- This hbase module is compiled using the thrift(1) command (version >= 0.10 [!])
# and a Hbase.thrift file (obtained from http://archive.apache.org/dist/hbase/
# -- Also, your "pip freeze | grep '^thrift='" should show a version of >= 0.10 [!]
# if you want Python3 support.
(host,port) = ("vps00","9090")
transport = TFramedTransport(TSocket.TSocket(host, port))
protocol = TCompactProtocol.TCompactProtocol(transport)
client = Hbase.Client(protocol)
transport.open()
# Do stuff here ...
print(client.getTableNames()) # Works. Output: [b'ns1:mytable', ]
transport.close()
Надеюсь, это избавит людей от боли, через которую я прошел.=:)
КРЕДИТЫ :