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

Java 程序通过 Thrift2 地址访问 HBase 实例

最近更新时间2023.12.18 15:44:46

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

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

前提条件

  • 如需通过私网地址访问 HBase 实例,需同时满足如下要求:

    • 已购 ECS 服务器与 HBase 实例在相同私有网络 VPC 下。ECS 服务器的购买方法,请参见购买云服务器
    • 已将 ECS 服务器的 IP 地址添加至 HBase 中的白名单中。白名单设置方法,请参见编辑白名单
  • 如需通过公网地址访问 HBase 实例,需确保运行 Java 工具的设备 IP 地址已加入 HBase 实例的白名单中。白名单设置方法,请参见编辑白名单

  • 已在 ECS 实例或本地设备上安装 Java 环境,建议使用 JDK 8 版本。更多详情,请参见 Java Downloads

操作步骤

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

    说明

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

  2. 配置 Thrift2 地址来访问 HBase 实例。
    在您的业务代码中设置如下配置来连接实例。

    说明

    将代码中的 ${"HBase Thrift2 的连接地址"}, ${端口号} 替换为您 HBase 实例的 Thrift2 连接地址和端口号,您就可以使用如下示例代码来访问 HBase 实例。如下代码中包括了定义表、写入数据、读取数据的具体代码示例。

    package com.bytedance.hbase.example;
    
    import org.apache.hadoop.hbase.thrift2.generated.TColumn;
    import org.apache.hadoop.hbase.thrift2.generated.TColumnValue;
    import org.apache.hadoop.hbase.thrift2.generated.TGet;
    import org.apache.hadoop.hbase.thrift2.generated.THBaseService;
    import org.apache.hadoop.hbase.thrift2.generated.TPut;
    import org.apache.hadoop.hbase.thrift2.generated.TResult;
    import org.apache.hadoop.hbase.thrift2.generated.TScan;
    import org.apache.thrift.protocol.TBinaryProtocol;
    import org.apache.thrift.protocol.TProtocol;
    import org.apache.thrift.transport.TSocket;
    import org.apache.thrift.transport.TTransport;
    import org.apache.thrift.transport.layered.TFramedTransport;
    
    import java.nio.ByteBuffer;
    import java.util.Arrays;
    import java.util.List;
    
    public class HBaseThriftExample {
    
      public static void main(String args[]) throws Exception{
        // 通过 TSocket、TBinaryProtocol 开启一个到 HBase 实例的 Thrift2 连接
        TSocket socket = new TSocket(${"HBase Thrift2 的连接地址"}, ${端口号});
        TTransport transport = new TFramedTransport(socket);
        TProtocol protocol = new TBinaryProtocol(transport);
    
        THBaseService.Iface client = new THBaseService.Client(protocol);
        transport.open();
    
        // 定义表信息
        ByteBuffer table = ByteBuffer.wrap(${"table name"}.getBytes());
        ByteBuffer row = ByteBuffer.wrap(${"row name"}.getBytes());
        ByteBuffer family = ByteBuffer.wrap(${"columnfamily name"}.getBytes());
        ByteBuffer qualifier = ByteBuffer.wrap(${"qualifier name"}.getBytes());
        ByteBuffer value = ByteBuffer.wrap(${"column value"}.getBytes());
    
        // 通过 TPut 更新已有数据或插入一个新数据
        System.out.println("---put or update a key---");
        TPut put = new TPut();
        put.setRow(row);
        TColumnValue colVal = new TColumnValue(family, qualifier, value);
        put.setColumnValues(Arrays.asList(colVal));
        client.put(table, put);
    
        // 通过 TGet 查询指定或全部列及列簇的信息
        System.out.println("---get a row---");
        TGet get = new TGet();
        get.setRow(row);
        TColumn col = new TColumn()
                .setFamily(family)  // 不指定列簇,即是获取所有列簇
                .setQualifier(qualifier); // 不指定列名,即是获取所有列
        get.setColumns(Arrays.asList(col));
        TResult result = client.get(table, get);
        //System.out.println("get row : " + new String(result.getRow()));
    
        result.getColumnValues().forEach(c -> {
          System.out.println(new String(result.getRow()) + "  " + new String(c.getFamily()) + "_" +
                  new String(c.getQualifier()) + ":" + new String(c.getValue()));
        });
    
        // 通过 TScan 查询全表的信息
        System.out.println("---scan a table---");
        TScan scan = new TScan();
        List<TResult> resultList = client.getScannerResults(table, scan, 2);
        resultList.forEach(r -> r.getColumnValues().forEach(c -> {
          System.out.println(new String(r.getRow()) + "  " + new String(c.getFamily()) + "_" +
                  new String(c.getQualifier()) + ":" + new String(c.getValue()));
        }));
    
        // 通过 close 函数关闭 Thrift2 连接
        transport.close();
        socket.close();
      }
    
    }
    

相关操作

您也可以下载 HBase Java 代码工程 Demo,并替换其中的 Thrift2 连接地址、表名等变量后进行使用。