编辑:此问题和答案适用于遇到主题行中所述异常的任何人:TTransportException(type = 4,message =‘TSocket read 0 bytes’);是否Cloudera和/ …
经过一天的努力,我的问题的答案如下:
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', ]
请注意,虽然这个Q&amp; A是在上下文中构建的 Cloudera 事实证明(正如你将看到的那样) Thrift 版本和 Thrift 服务器端配置相关,因此适用于 Hortonworks 和 MapR 用户也是。
Cloudera
Thrift
Hortonworks
MapR
的 说明 强> :
上 Cloudera CDH v6.1.x (如果你访问的话,也可能是未来的版本) Hbase Thrift Server Configuration 它的管理部分U.I.,你会发现 - 在许多其他设置 - 这些:
Cloudera CDH v6.1.x
Hbase Thrift Server Configuration
请注意 compact protocol 和 framed transport 都启用了;所以他们相应地需要改变 happybase 从它的默认值(我在上面显示)。
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()
我希望这能让人们痛苦地度过难关。 = :)
的 学分 强> :