1.开发环境
SpringBoot:2.3.10
HBase:2.3.5
JDK:1.8
本文基于已经搭建好的HBase开发环境,若不清楚的可以阅读另一篇win10搭建Hadoop3.2.2和HBase2.3.5单机版
2.引入maven依赖
新建springboot-hbase模块,在pom.xml中引入如下依赖:
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.3.5</version>
</dependency>
3.application.yml配置
server:
port: 8122
spring:
application:
name: springboot-hbase
hbase:
config:
zookeeper:
quorum: 127.0.0.1
port: 2181
4.HBase工具类
该类主要是用于连接HBase数据,具体代码如下:
@Component
public class HBaseUtils {
private static String quorums;
@Value("${hbase.config.zookeeper.quorum}")
private String quorum;
@PostConstruct
public void getQuorum() {
quorums = this.quorum;
}
/**
* 获取hbase连接
* @return
* @throws Exception
*/
public static Connection getHBaseConnection() {
Connection connection = null;
try {
//hbase配置对象
Configuration configuration = HBaseConfiguration.create();
//设置zookeeper地址
configuration.set("hbase.zookeeper.quorum", quorums);
//获取hbase连接对象
connection = ConnectionFactory.createConnection(configuration);
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
}
根据表名获取表信息代码如下:
public static Table getTable(String tbName) throws Exception {
TableName tableName = TableName.valueOf(tbName);
Table table = getHBaseConnection().getTable(tableName);
return table;
}
5.HBase常用操作业务接口和实现类
常用的接口如下代码:
/**
* 判断表是否存在
* @param tableName 表名
* @return
*/
boolean isTableExist(String tableName) throws Exception;
/**
* 新建表
* @param tableName 表名
* @param columnFamily 列族
*/
void createTable(String tableName, String... columnFamily) throws Exception;
/**
* 添加数据
* @param request
* @throws Exception
*/
void addData(RequestDto request) throws Exception;
/**
* 获取一条数据
* @param tableName 表名
* @param rowKey
*/
Result getOneData(String tableName, String rowKey) throws Exception;
/**
* 获取多条数据
* @param tableName 表名
* @param startRowKey 开始rowkey
* @param endRowKey 结束rowkey
*/
ResultScanner getMultiData(String tableName, String startRowKey, String endRowKey) throws Exception;
/**
* 获取所有数据
* @param tableName
*/
ResultScanner getAllData(String tableName) throws Exception;
/**
* 根据row过滤器查询
* @param tableName 表名
* @param rowStr row过滤符
* @return
* @throws Exception
*/
ResultScanner getDataByRow(String tableName, String rowStr) throws Exception;
/**
* 获取列名
* @param tableName
* @return
* @throws IOException
*/
Result getRowQualifier(String tableName) throws Exception;
/**
* 根据rowkey和rowkey前缀分页查询
* @param tableName 表名
* @param rowKey
* @param rowStr 前缀
* @param pageSize 每页条数
* @return
*/
ResultScanner getPageDataByRow(String tableName, String rowKey, String rowStr, int pageSize) throws Exception;
/**
* 根据行权限和列权限分页查询
* @param tableName
* @param rowKey
* @param rowStr
* @param qualifierStr
* @param pageSize
* @return
*/
ResultScanner getPageDataByRowAndQualifier(String tableName, String rowKey, String rowStr, String qualifierStr, int pageSize) throws Exception;
接口实现类代码如下:
@Override
public boolean isTableExist(String tableName) throws Exception {
Admin admin = HBaseUtils.getAdmin();
boolean exists = admin.tableExists(TableName.valueOf(tableName));
return exists;
}
@Override
public void createTable(String tableName, String... columnFamily) throws Exception {
if (this.isTableExist(tableName)) {
log.info("该表{}已存在,不需要创建!", tableName);
}
Admin admin = HBaseUtils.getAdmin();
TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName));
for (String family : columnFamily) {
ColumnFamilyDescriptorBuilder familyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(family));
ColumnFamilyDescriptor familyDescriptor = familyDescriptorBuilder.build();
builder.setColumnFamily(familyDescriptor);
TableDescriptor tableDescriptor = builder.build();
admin.createTable(tableDescriptor);
}
admin.close();
}
@Override
public void addData(RequestDto request) throws Exception {
Table table = HBaseUtils.getTable(request.getTableName());
Put put = new Put(Bytes.toBytes(request.getRowKey()));
put.addColumn(Bytes.toBytes(request.getColumnFamily()), Bytes.toBytes(request.getQualifier()), Bytes.toBytes(request.getValue()));
table.put(put);
table.close();
}
@Override
public Result getOneData(String tableName, String rowKey) throws Exception {
Table table = HBaseUtils.getTable(tableName);
Get get = new Get(Bytes.toBytes(rowKey));
Result result = table.get(get);
return result;
}
@Override
public ResultScanner getMultiData(String tableName, String startRowKey, String endRowKey) throws Exception {
Table table = HBaseUtils.getTable(tableName);
Scan scan = new Scan();
scan.withStartRow(Bytes.toBytes(startRowKey));
scan.withStopRow(Bytes.toBytes(endRowKey));
ResultScanner results = table.getScanner(scan);
table.close();
return results;
}
@Override
public ResultScanner getAllData(String tableName) throws Exception {
Table table = HBaseUtils.getTable(tableName);
Scan scan = new Scan();
ResultScanner results = table.getScanner(scan);
table.close();
return results;
}
@Override
public ResultScanner getDataByRow(String tableName, String rowStr) throws Exception {
Table table = HBaseUtils.getTable(tableName);
Scan scan = new Scan();
Filter rowFilter = new RowFilter(CompareOperator.GREATER_OR_EQUAL, new BinaryPrefixComparator(Bytes.toBytes(rowStr)));
scan.setFilter(rowFilter);
ResultScanner results = table.getScanner(scan);
return results;
}
@Override
public Result getRowQualifier(String tableName) throws Exception {
Table table = HBaseUtils.getTable(tableName);
Scan scan = new Scan();
scan.setLimit(1);
ResultScanner results = table.getScanner(scan);
Result result = null;
if (null != results) {
result = results.next();
}
return result;
}
@Override
public ResultScanner getPageDataByRow(String tableName, String rowKey, String rowStr, int pageSize) throws Exception {
Table table = HBaseUtils.getTable(tableName);
Scan scan = new Scan();
PageFilter pageFilter = new PageFilter(pageSize);
RowFilter rowFilter = new RowFilter(CompareOperator.GREATER_OR_EQUAL, new BinaryPrefixComparator(Bytes.toBytes(rowStr)));
FilterList filterList = new FilterList();
filterList.addFilter(pageFilter);
filterList.addFilter(rowFilter);
scan.setFilter(filterList);
if (!" ".equals(rowKey)) {
scan.withStartRow(Bytes.toBytes(rowKey));
}
ResultScanner results = table.getScanner(scan);
return results;
}
@Override
public ResultScanner getPageDataByRowAndQualifier(String tableName, String rowKey, String rowStr, String qualifierStr, int pageSize) throws Exception {
Table table = HBaseUtils.getTable(tableName);
Scan scan = new Scan();
PageFilter pageFilter = new PageFilter(pageSize);
RowFilter rowFilter = new RowFilter(CompareOperator.GREATER_OR_EQUAL, new BinaryPrefixComparator(Bytes.toBytes(rowStr)));
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("age"), CompareOperator.GREATER_OR_EQUAL, Bytes.toBytes(qualifierStr));
FilterList filterList = new FilterList();
filterList.addFilter(pageFilter);
filterList.addFilter(rowFilter);
filterList.addFilter(singleColumnValueFilter);
scan.setFilter(filterList);
if (!" ".equals(rowKey)) {
scan.withStartRow(Bytes.toBytes(rowKey));
}
ResultScanner results = table.getScanner(scan);
return results;
}
以上内容为SpringBoot整合HBase常用操作的核心代码