Cloudera / CDH v6.1.x + Python HappyBase v1.1.0: TTransportException (type = 4, message = 'TSocket read 0 bytes') - PullRequest
0 голосов
/ 13 февраля 2019

РЕДАКТИРОВАТЬ: Этот вопрос и ответ применяется ко всем, кто испытывает исключение, указанное в строке темы: TTransportException (type = 4, message = 'TSocket read 0 bytes') ;задействованы ли Cloudera и / или HappyBase.

Основная проблема (как выяснилось) связана с несовпадением форматов protocol и / или transport на client-side с тем, что server-sideреализуется, и это может произойти с любым клиент-сервером.Мой только что оказался Cloudera и HappyBase, но вам не нужно, и вы можете столкнуться с этой же проблемой.

Кто-нибудь недавно пытался использовать пакет happybase v1.1.0 (latest) Pythonвзаимодействовать с Hbase на Cloudera CDH v6.1.x?

Я пробую различные варианты с ним, но продолжаю получать исключение:

thriftpy.transport.TTransportException:
TTransportException(type=4, message='TSocket read 0 bytes')

Вот как я начинаю сеанс и отправляюпростой вызов для получения списка таблиц (используя Python v3.6.7:

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='buffered',
    protocol='binary'
)

print('tables:', hbase_cnxn.tables()) # Exception happens here.

А вот как Cloudera CDH v6.1.x запускает сервер Hbase Thrift (сокращенно для краткости):

/usr/java/jdk1.8.0_141-cloudera/bin/java [... snip ... ] \
    org.apache.hadoop.hbase.thrift.ThriftServer start \
    --port 9090 -threadpool --bind 0.0.0.0 --framed --compact

Я пробовал несколько вариантов вариантов, но ничего не получилось.

Кто-нибудь когда-нибудь заставлял это работать?

РЕДАКТИРОВАТЬ : я в следующий раз скомпилировал Hbase.thrift (из исходных файлов Hbase - той же версии HBase, которая использовалась CDH v6.1.x), и использовал пакет привязок Python thrift (другими словами, я удалил happybase из уравнения) и получил то же исключение.

(._.);

Спасибо!

1 Ответ

0 голосов
/ 13 февраля 2019

После нескольких дней работы над этим ответ на мой вопрос следующий:

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 его интерфейса управления, вы найдете среди многих других параметров следующие параметры:


CDH6.1.x Hbase Thrift Server Configuration U.I.

Обратите внимание, что 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()

Надеюсь, это избавит людей от боли, через которую я прошел.=:)

КРЕДИТЫ :

...