HBase 是基于 Hadoop HDFS 构建的分布式、列式存储的 NoSQL 数据库,适用于存储和检索超大规模的非结构化数据。它支持随机读写,并且能够处理 PB 级数据。HBase 通常用于实时数据存取场景,与 Hadoop 生态紧密集成。
<dependencies>
<dependency>
<groupId>org.apache.hbasegroupId>
<artifactId>hbase-clientartifactId>
<version>2.4.8version>
dependency>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-commonartifactId>
<version>3.2.2version>
dependency>
dependencies>
以下是一个简单的 HBase 使用案例,展示如何创建表、插入数据、获取数据和删除数据。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class HBaseExample {
// HBase 配置
private static Configuration config;
private static Connection connection;
private static Admin admin;
public static void main(String[] args) throws IOException {
// 初始化 HBase 配置
config = HBaseConfiguration.create();
config.set("hbase.zookeeper.quorum", "{ZOOKEEPER_HOST}"); // 设置 ZooKeeper 地址
config.set("hbase.zookeeper.property.clientPort", "2181"); // 设置 ZooKeeper 端口
// 获取 HBase 连接
connection = ConnectionFactory.createConnection(config);
admin = connection.getAdmin();
// 表名与列族名
TableName tableName = TableName.valueOf("test_table");
String columnFamily = "cf";
// 1. 创建表
createTable(tableName, columnFamily);
// 2. 插入数据
insertData(tableName, columnFamily, "row1", "name", "Alice");
insertData(tableName, columnFamily, "row1", "age", "30");
// 3. 获取数据
getData(tableName, columnFamily, "row1", "name");
getData(tableName, columnFamily, "row1", "age");
// 4. 删除表
deleteTable(tableName);
// 关闭资源
connection.close();
}
// 创建表
private static void createTable(TableName tableName, String columnFamily) throws IOException {
if (admin.tableExists(tableName)) {
System.out.println("Table already exists.");
} else {
TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);
ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));
tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());
admin.createTable(tableDescriptorBuilder.build());
System.out.println("Table " + tableName + " created.");
}
}
// 插入数据
private static void insertData(TableName tableName, String columnFamily, String rowKey, String qualifier, String value) throws IOException {
Table table = connection.getTable(tableName);
Put put = new Put(Bytes.toBytes(rowKey));
put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(qualifier), Bytes.toBytes(value));
table.put(put);
System.out.println("Inserted data: " + rowKey + " => " + qualifier + ": " + value);
table.close();
}
// 获取数据
private static void getData(TableName tableName, String columnFamily, String rowKey, String qualifier) throws IOException {
Table table = connection.getTable(tableName);
Get get = new Get(Bytes.toBytes(rowKey));
get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(qualifier));
Result result = table.get(get);
byte[] value = result.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(qualifier));
if (value != null) {
System.out.println("Retrieved data: " + rowKey + " => " + qualifier + ": " + Bytes.toString(value));
} else {
System.out.println("No data found for row: " + rowKey);
}
table.close();
}
// 删除表
private static void deleteTable(TableName tableName) throws IOException {
if (admin.tableExists(tableName)) {
admin.disableTable(tableName);
admin.deleteTable(tableName);
System.out.println("Table " + tableName + " deleted.");
} else {
System.out.println("Table " + tableName + " does not exist.");
}
}
}
HBase 配置:
config.set("hbase.zookeeper.quorum", "{ZOOKEEPER_HOST}")
:这里的 {ZOOKEEPER_HOST}
是你 ZooKeeper 服务的主机名或 IP 地址。ZooKeeper 是 HBase 的分布式协调服务,用于管理集群状态。表操作:
Admin
对象创建和删除表。在创建表时,使用 TableDescriptorBuilder
和 ColumnFamilyDescriptorBuilder
定义表和列族。插入数据:
Put
对象插入数据到指定的行键、列族和列限定符。获取数据:
Get
对象根据行键和列限定符获取数据。删除表:
admin.disableTable()
和 admin.deleteTable()
来删除表。运行程序后,你可以看到以下输出(假设表不存在):
Table test_table created.
Inserted data: row1 => name: Alice
Inserted data: row1 => age: 30
Retrieved data: row1 => name: Alice
Retrieved data: row1 => age: 30
Table test_table deleted.
这个简单的 HBase 案例演示了如何在 Java 应用中使用 HBase 进行表的创建、数据插入、数据检索和表的删除操作。HBase 适合存储大规模、稀疏的非结构化数据,能够很好地支持实时读写操作。