NYC*_*yes 1 python hbase thrift happybase cloudera-cdh
编辑:此问题和答案适用于遇到主题行中所述异常的任何人:TTransportException(type=4, message='TSocket read 0 bytes');无论是否涉及 Cloudera 和/或 HappyBase。
根本问题(事实证明)源于正在实现的内容的不匹配和
protocol/或transport格式,并且任何客户端/服务器配对都可能发生这种情况。我的恰好是Cloudera 和 HappyBase,但你的不一定是,你也可能会遇到同样的问题。client-sideserver-side
最近有没有人尝试过使用Python 包与onhappybase v1.1.0 (latest)进行交互?HbaseCloudera CDH v6.1.x
我正在尝试各种选项,但不断出现异常:
thriftpy.transport.TTransportException:
TTransportException(type=4, message='TSocket read 0 bytes')
Run Code Online (Sandbox Code Playgroud)
以下是我如何启动会话并提交一个简单的调用来获取表列表(使用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.
Run Code Online (Sandbox Code Playgroud)
以下是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
Run Code Online (Sandbox Code Playgroud)
我尝试了几种选项的变体,但一无所获。
有人曾经让它工作过吗?
编辑:我接下来编译Hbase.thrift(从Hbase源文件 -HBase与使用的版本相同CDH v6.1.x)并使用Pythonthrift绑定包(换句话说,我happybase从等式中删除)并得到相同的异常。
(._.);
谢谢你!
经过一天的努力,我的问题的答案如下:
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', ]
Run Code Online (Sandbox Code Playgroud)
请注意,虽然此问答是在 的上下文中构建的Cloudera,但事实证明(正如您将看到的),这是与Thrift版本和Thrift服务器端配置相关的,因此它也适用于Hortonworks和MapR用户。
解释:
在Cloudera CDH v6.1.x(也可能是未来的版本)上,如果您访问Hbase Thrift Server Configuration其管理 UI 部分,您会发现 - 在许多其他设置中 - 这些:

请注意,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()
Run Code Online (Sandbox Code Playgroud)
我希望这能让人们免受我所经历的痛苦。=:)
学分:
| 归档时间: |
|
| 查看次数: |
2816 次 |
| 最近记录: |