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)|浏览(733)

编辑:此问答适用于遇到主题行中所述异常的任何人: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 ?
我尝试了各种各样的选择,但总是有例外:

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

下面是如何启动会话并提交一个简单的调用来获取表列表(使用 Python v3.6.7 :

  1. import happybase
  2. CDH6_HBASE_THRIFT_VER='0.92'
  3. hbase_cnxn = happybase.Connection(
  4. host='vps00', port=9090,
  5. table_prefix=None,
  6. compat=CDH6_HBASE_THRIFT_VER,
  7. table_prefix_separator=b'_',
  8. timeout=None,
  9. autoconnect=True,
  10. transport='buffered',
  11. protocol='binary'
  12. )
  13. print('tables:', hbase_cnxn.tables()) # Exception happens here.

下面是如何 Cloudera CDH v6.1.x 启动 Hbase Thrift 服务器(为简洁起见,已截断):

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

我试过几种不同的选择,但一无所获。
有人用过这个吗?
编辑:我下一个编译 Hbase.thrift (来自 Hbase 源文件--相同 HBase 使用的版本 CDH v6.1.x )用Python thrift 绑定包(换句话说,我删除了 happybase 从方程式)得到了同样的例外。
(._.);
谢谢您!

jv4diomz

jv4diomz1#

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

  1. import happybase
  2. CDH6_HBASE_THRIFT_VER='0.92'
  3. hbase_cnxn = happybase.Connection(
  4. host='vps00', port=9090,
  5. table_prefix=None,
  6. compat=CDH6_HBASE_THRIFT_VER,
  7. table_prefix_separator=b'_',
  8. timeout=None,
  9. autoconnect=True,
  10. transport='framed', # Default: 'buffered' <---- Changed.
  11. protocol='compact' # Default: 'binary' <---- Changed.
  12. )
  13. 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 解决方案(注意阅读下面我的注解):

  1. from thrift.protocol import TCompactProtocol # Notice the import: TCompactProtocol [!]
  2. from thrift.transport.TTransport import TFramedTransport # Notice the import: TFramedTransport [!]
  3. from thrift.transport import TSocket
  4. from hbase import Hbase
  5. # -- This hbase module is compiled using the thrift(1) command (version >= 0.10 [!])
  6. # and a Hbase.thrift file (obtained from http://archive.apache.org/dist/hbase/
  7. # -- Also, your "pip freeze | grep '^thrift='" should show a version of >= 0.10 [!]
  8. # if you want Python3 support.
  9. (host,port) = ("vps00","9090")
  10. transport = TFramedTransport(TSocket.TSocket(host, port))
  11. protocol = TCompactProtocol.TCompactProtocol(transport)
  12. client = Hbase.Client(protocol)
  13. transport.open()
  14. # Do stuff here ...
  15. print(client.getTableNames()) # Works. Output: [b'ns1:mytable', ]
  16. transport.close()

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

展开查看全部

相关问题