表格数据库 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 连接地址、表名等变量后进行使用。