cloudera/cdh v6.1.x+python happybase v1.1.0:tttransportexception(type=4,message='tsocket read 0 bytes')

q43xntqr  于 2021-06-09  发布在  Hbase
关注(0)|答案(1)|浏览(677)

编辑:此问答适用于遇到主题行中所述异常的任何人:ttTransportException(type=4,message='tsocket read 0 bytes');是否涉及cloudera和/或happybase。
根本问题(事实证明)源于不匹配 protocol 和/或 transport 屏幕上的格式 client-side 用什么 server-side 正在实现,任何客户端/服务器配对都可能发生这种情况。我的刚好是cloudera和happybase,但你的不必是,你可能会遇到同样的问题。
最近有人试过使用 happybase v1.1.0 (latest) 与之交互的python包 HbaseCloudera 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 从方程式)得到了同样的例外。
(._.);
谢谢您!

jv4diomz

jv4diomz1#

经过一天的努力,我的问题的答案如下:

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 在它的管理u.i.部分,你会发现——在许多其他设置中——这些:

注意 compact protocol 以及 framed transport 都已启用;因此,他们相应地需要改变 happybase 从它的默认值(我在上面显示)。
正如在我的第一个问题的后续编辑中提到的,我还调查了一个纯粹的 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()

我希望这能减轻人们对我的痛苦
信用:
这里(mapr)和
这里(来自中国的博客)

相关问题