使用Java操作HBase

开启 Hadoop 和 HBase

点击测评前,请先执行以下操作:

  1. 启动 Hadoop:

    1
    start-dfs.sh  
  2. 启动 HBase:

    1
    start-hbase.sh  

    注意

    :需等待 HBase 初始化完成(约 20 秒),否则无法创建表。

验证 HBase 初始化状态

输入以下命令查看 HBase 根目录:

1
hadoop fs -ls /hbase  

若显示相关文件或目录(如.tmpmaster等),则表示初始化成功。

连接 HBase

配置对象创建

通过HBaseConfiguration读取配置文件(hbase-site.xmlhbase-default.xml):

1
2
3
4
5
6
7
8
9
import org.apache.hadoop.conf.Configuration;  
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;

// 创建配置对象
Configuration config = HBaseConfiguration.create();
// 创建连接对象
Connection connection = ConnectionFactory.createConnection(config);

创建表

1.0 版本写法

1
2
3
4
5
6
7
8
9
10
11
12
13
import org.apache.hadoop.hbase.TableName;  
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;

Admin admin = connection.getAdmin();
TableName tableName = TableName.valueOf("test");
HTableDescriptor htd = new HTableDescriptor(tableName);
HColumnDescriptor hcd = new HColumnDescriptor("data"); // 列族名为"data"
htd.addFamily(hcd);
admin.createTable(htd);
admin.close();
connection.close();

2.X 版本写法(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import org.apache.hadoop.hbase.TableName;  
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;

Admin admin = connection.getAdmin();
TableName tableName = TableName.valueOf("test");
// 构建表描述符
TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
// 构建列族(列族名为"data")
ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder
.newBuilder(Bytes.toBytes("data"))
.build();
tableDescriptor.setColumnFamily(family);
admin.createTable(tableDescriptor.build());
admin.close();
connection.close();

添加数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import org.apache.hadoop.hbase.TableName;  
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;

Table table = connection.getTable(TableName.valueOf("test"));
try {
// 插入第一条数据
Put put = new Put(Bytes.toBytes("row1"));
put.addColumn(
Bytes.toBytes("data"), // 列族
Bytes.toBytes("1"), // 列修饰符
Bytes.toBytes("张三丰") // 值
);
table.put(put);

// 插入第二条数据
Put put2 = new Put(Bytes.toBytes("row2"));
put2.addColumn(
Bytes.toBytes("data"),
Bytes.toBytes("2"),
Bytes.toBytes("张无忌")
);
table.put(put2);
} finally {
// 释放资源
table.close();
connection.close();
}

查询数据

查询单条数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import org.apache.hadoop.hbase.client.Get;  
import org.apache.hadoop.hbase.client.Result;

TableName tableName = TableName.valueOf("test");
Table table = connection.getTable(tableName);
Get get = new Get(Bytes.toBytes("row1"));
Result result = table.get(get);

// 获取指定列族和列修饰符的值
byte[] valueBytes = result.getValue(
Bytes.toBytes("data"),
Bytes.toBytes("1")
);
String valueStr = new String(valueBytes, "utf-8");
System.out.println("value: " + valueStr); // 输出:value: 张三丰

批量扫描数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import org.apache.hadoop.hbase.client.Scan;  
import org.apache.hadoop.hbase.client.ResultScanner;

tableName = TableName.valueOf("test");
table = connection.getTable(tableName);
Scan scan = new Scan();
ResultScanner scanner = table.getScanner(scan);

try {
for (Result scannerResult : scanner) {
byte[] row = scannerResult.getRow();
System.out.println("rowName: " + new String(row, "utf-8"));
// 可进一步解析列数据...
}
} finally {
scanner.close(); // 释放扫描器资源
}

删除表

1
2
3
4
5
6
7
8
9
10
Admin admin = connection.getAdmin();  
TableName tableName = TableName.valueOf("test");

// 禁用表(删除前必须先禁用)
admin.disableTable(tableName);
// 删除表
admin.deleteTable(tableName);

admin.close();
connection.close();

注意事项

  • HBase 表名、列族名、列修饰符均为字节数组,建议通过Bytes.toBytes()处理字符串。
  • 操作完成后务必关闭ConnectionTableAdmin等资源,避免内存泄漏。
  • 删除表前需先调用disableTable(),否则会抛出异常。

使用Java操作HBase
http://example.com/2024/10/20/使用Java操作HBase/
作者
John Doe
发布于
2024年10月20日
许可协议