表格数据库 HBase 版默认提供了 ZK 连接地址,同时也支持 Thrift 多语言访问,Thrift 是 HBase 标准版实例中的一种服务组件,基于 Apache Thrift(多语言支持的通信框架)开发。本文介绍基于 Java 程序通过 Thrift2 地址访问 HBase 实例的操作步骤。
如需通过私网地址访问 HBase 实例,需同时满足如下要求:
如需通过公网地址访问 HBase 实例,需确保运行 Java 工具的设备 IP 地址已加入 HBase 实例的白名单中。白名单设置方法,请参见编辑白名单。
已在 ECS 实例或本地设备上安装 Java 环境,建议使用 JDK 8 版本。更多详情,请参见 Java Downloads。
获取 HBase 实例的 Thrift2 连接地址。
连接地址查看方法,请参见查看连接地址。
说明
表格数据库 HBase 版默认未开通 Thrift2 地址,您需要先申请 Thrift2 连接地址,申请方法,请参见申请 Thrift2 连接地址。
配置 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 连接地址、表名等变量后进行使用。