You need to enable JavaScript to run this app.
导航

Python 程序通过 Thrift 2 地址访问 HBase 实例

最近更新时间2023.06.09 13:41:30

首次发布时间2022.12.27 16:12:46

表格数据库 HBase 版默认提供了 ZK 连接地址,同时也支持 Thrift 多语言访问,Thrift 是 HBase 标准版实例中的一种服务组件,基于 Apache Thrift(多语言支持的通信框架)开发。本文介绍基于 Python 程序通过 Thrift2 地址访问 HBase 实例的操作步骤。

前提条件

  • 如需通过私网地址访问 HBase 实例,需同时满足如下要求:
    • 已购 ECS 服务器与 HBase 实例在相同私有网络 VPC 下。ECS 服务器的购买方法,请参见购买云服务器
    • 已将 ECS 服务器的 IP 地址添加至 HBase 中的白名单中。白名单设置方法,请参见编辑白名单
  • 如需通过公网地址访问 HBase 实例,需确保运行 Python 工具的设备 IP 地址已加入 HBase 实例的白名单中。白名单设置方法,请参见编辑白名单
  • 已在 ECS 实例或本地设备上安装 Python 程序,建议使用 Python 3.x.x 版本。您可以通过 python version 命令检查当前 Python 的版本。

操作步骤

  1. 获取 HBase 实例的 Thrift2 连接地址。
    连接地址查看方法,请参见查看连接地址

    说明

    表格数据库 HBase 版默认未开通 Thrift2 地址,您需要先申请 Thrift2 连接地址,申请方法,请参见申请 Thrift2 连接地址

  2. 在 ECS 实例或本地设备上安装 Thrift 服务,建议安装 0.14.2 或以上版本的 Thrift 服务。
    关于 Thrift 服务的更多详情,请参见 Apache Thrift
  3. 在 Python 程序中下载并安装 HBase Thrift 模块。
    1. 下载已编译好的 Thrift 文件(文件中包含了可供 Python 访问的 HBase Thrift 模块),并将其保存在已安装了 Thrift 服务的 ECS 实例或本地设备上。
    2. 配置 Python 环境变量,来引用 HBase Thrift 模块。
      命令如下。
      mv hbase/ /<ECS 实例或本地设备上 Python 的安装目录>/Python/3.8/lib/python/site-packages/
      
    3. 安装 HBase Thrift 模块。
      命令如下。
      pip install thrift
      
  4. 在 Python 程序中使用 Thrift 2 地址访问 HBase 实例。
    代码如下。
    # encoding:utf-8
    #!/usr/bin/env python3
    
    import random
    
    # 通过 TTransport、TSocket 和 TBinaryProtocol 开启一个 Thrift2 连接。
    from thrift.transport import TTransport
    from thrift.transport import TSocket
    from thrift.protocol import TBinaryProtocol
    
    #来自thrift --gen py hbase.thrift
    from hbase import THBaseService
    from hbase.ttypes import TPut, TColumnValue, TGet
    
    def demo():
        # 连接到 目标 HBase 实例
        socket = TSocket.TSocket(<"HBase Thrift2 的连接地址">, 端口号>)
        socket.setTimeout(100)
        transport = TTransport.TFramedTransport(socket)
        protocol = TBinaryProtocol.TBinaryProtocol(transport)
        
        client = THBaseService.Client(protocol)
        transport.open()
        
        # 生成一个随机 Key 作为一行记录的唯一标识、
        # 本文示例中 Key 名称为 examplexxxx,其中 example 为名称中的常量,xxxx 为变量,该变量是由一个 1~1000 的数字转换成的字符串。
        key = "example" + str(random.randint(1,1000))
        
        # 使用 TPut 命令往 Key 中传入数据。
        # Key 名称、列簇名(family)、列名(qualifier)以及 value 值都需要通过 b 符号转化为 bytes 类型。
        tput = TPut(
            row=str.encode(key),
            columnValues=[
                TColumnValue(family=b'f1', qualifier=b'c1', value=b'0.28'),
            ]
        )
        client.put(b't1', tput)
    
        #通过 TGet 命令获取 Key 中的数据。
        tget = TGet(row=str.encode(key))
        tresult = client.get(b't1', tget)
        for col in tresult.columnValues:
            print(col.qualifier, '=', col.value)
    
        # 通过 close() 函数关闭 Thrift2 连接。
        transport.close()
        socket.close()    
            
    if __name__ == "__main__":
        demo()