简体   繁体   English

HBase Thrift2 Python客户端API无效

[英]Hbase thrift2 python client API invalid

I am write a python script to load data from hbase. 我正在写一个python脚本从hbase加载数据。 But things seem to goes wrong in thrift generated files. 但是thrift生成的文件似乎出了问题。 Here is my code: 这是我的代码:

def create_hbase_connection():
    thrift_socket = TSocket.TSocket(thrift_server, thrift_port)
    thrift_socket.setTimeout(thrift_timeout)
    thrift_transport = TTransport.TFramedTransport(thrift_socket)
    thrift_protocol = TBinaryProtocol.TBinaryProtocolAccelerated(thrift_transport)
    thrift_client = THBaseService.Client(thrift_protocol)
    try:
        thrift_transport.open()
    except Exception as e:
        print "connect to hbase thrift failed. (%s)" % e
        sys.exit()

    return thrift_protocol, thrift_client

def fetch_rows_from_hbase(thrift_protocol, thrift_client, start_row = None):
    tscan = ttypes.TScan()
    if start_row != None:
        tscan.startRow = start_row
    tscan.maxVersions = max_versions
    tscan.filterString = "FamilyFilter(!=, 'binary:ge')"
    scan_id = thrift_client.openScanner(hbase_table_name, tscan)
    result = thrift_client.getScannerRows(scan_id, row_limits + 1)
    print result
    print "=================================================\n"
    thrift_client.closeScanner(scan_id)
    thrift_protocol.close()

if __name__ == '__main__':
    thrift_protocol, thrift_client = create_hbase_connection()
    fetch_rows_from_hbase(thrift_protocol, thrift_client)

And here is the error: 这是错误:

Traceback (most recent call last): File "./load_hbase.py", line 46, in fetch_rows_from_hbase(thrift_protocol, thrift_client) File "./load_hbase.py", line 37, in fetch_rows_from_hbase scan_id = thrift_client.openScanner(hbase_table_name, tscan) File "/home/lishaohua/kpn/load_hbase/thrift2/hbase/THBaseService.py", line 715, in openScanner return self.recv_openScanner() File "/home/lishaohua/kpn/load_hbase/thrift2/hbase/THBaseService.py", line 735, in recv_openScanner result.read(iprot) File "/home/lishaohua/kpn/load_hbase/thrift2/hbase/THBaseService.py", line 3278, in read fastbinary.decode_binary(self, iprot.trans, (self. class , self.thrift_spec)) AttributeError: 'TFramedTransport' object has no attribute 'trans' 追溯(最近一次通话最近):fetch_rows_from_hbase(thrift_protocol,thrift_client)中的文件“ ./load_hbase.py”,第46行,fetch_rows_from_hbase中的文件“ ./load_hbase.py”,第37行,scan_id = thrift_client.openScanner(hscan_table_name, )在openScanner返回的self.recv_openScanner()文件“ /home/lishaohua/kpn/load_hbase/thrift2/hbase/THBaseService.py”中,行715 ”,在recv_openScanner result.read(iprot)文件中的第735行,在读取fastbinary.decode_binary(self,iprot.trans,(self)中的“ /home/lishaohua/kpn/load_hbase/thrift2/hbase/THBaseService.py”,第3278行, 。class ,self.thrift_spec))AttributeError:“ TFramedTransport”对象没有属性“ trans”

I check the code in TTransport.py , TFramedTransport has the attribute self.__trans . 我检查TTransport.py的代码, TFramedTransport具有属性self.__trans How to fix this? 如何解决这个问题? I can simply change tans to __trans , but there are more problems. 我可以简单地将tans更改为__trans ,但是还有更多问题。

I used TBufferedTransport instead of TFramedTransport , and it worked. 我使用了TBufferedTransport而不是TFramedTransport ,并且它起作用了。 You can try my solution below: 您可以在下面尝试我的解决方案:

class ThriftConn(object):
    def __init__(self, ip, port, service_cls):
        self.socket = TSocket.TSocket(ip, port)
        self.trans = TTransport.TBufferedTransport(self.socket)                                                                                                                                                   
        self.protocol = TBinaryProtocol.TBinaryProtocol(self.trans)
        self.client = service_cls.Client(self.protocol)

    def __enter__(self):
        self.trans.open()

    def __exit__(self, exception_type, exception_value, 
        exception_traceback):
        self.trans.close()

HBASE_SERVER_CLIENT = ThriftConn(ip, port, THBaseService)
with HBASE_SERVER_CLIENT:
    scan = TScan()
    scan_id = HBASE_SERVER_CLIENT.client.openScanner(table, scan)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM