1. 概述

在这篇文章中,我们将探讨Apache HBase数据库的Java客户端库。HBase是一个分布式数据库,它使用Hadoop文件系统来存储数据。

我们将创建一个Java示例客户端,并为它创建一个表,然后添加一些简单的记录。

2. HBase 数据结构

在HBase中,数据被组织成列族。列族中的所有列成员具有相同的前缀。

例如,列 family1:qualifier1family1:qualifier2 都属于 family1 列族。所有列族成员都一起存储在文件系统上。

在列族内部,我们可以为指定的资格器(qualifier)放置一行。我们可以将资格器视为列名的一种。

让我们看看HBase的一个示例记录:

Family1:{  
   'Qualifier1':'row1:cell_data',
   'Qualifier2':'row2:cell_data',
   'Qualifier3':'row3:cell_data'
}
Family2:{  
   'Qualifier1':'row1:cell_data',
   'Qualifier2':'row2:cell_data',
   'Qualifier3':'row3:cell_data'
}

我们有两个列族,每个都有三个资格器,其中包含一些单元格数据。每一行都有一个行键(row key)——它是唯一的行标识符。我们将使用行键来插入、检索和删除数据。

3. HBase 客户端Maven依赖

在连接到HBase之前,我们需要添加 hbase-clienthbase 依赖项:

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>2.5.3</version>
</dependency>
<dependency>
     <groupId>org.apache.hbase</groupId>
     <artifactId>hbase</artifactId>
     <version>2.5.3</version>
</dependency>

4. HBase 设置

为了能够从Java客户端库连接到HBase,我们需要设置它。安装过程超出了本文的范围,但您可以在网上找到一些HBase安装指南

接下来,我们需要在本地启动一个HBase主节点,执行以下命令:

hbase master start

5. 从Java连接HBase

要从Java程序中进行程序化连接,我们需要定义一个XML配置文件。我们在localhost上启动了HBase实例,所以需要将其添加到配置文件中:

<configuration>
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>localhost</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.clientPort</name>
        <value>2181</value>
    </property>
</configuration>

现在我们需要将HBase客户端指向那个配置文件:

Configuration config = HBaseConfiguration.create();

String path = this.getClass()
  .getClassLoader()
  .getResource("hbase-site.xml")
  .getPath();
config.addResource(new Path(path));

接下来,我们检查是否成功连接到HBase——如果连接失败,将抛出 MasterNotRunningException

HBaseAdmin.available(config);

6. 创建数据库结构

在开始向HBase添加数据之前,我们需要创建插入行的数据结构。我们将创建一个表,其中包含两个列族:

private TableName table1 = TableName.valueOf("Table1");
private String family1 = "Family1";
private String family2 = "Family2";

首先,我们需要连接到数据库并获取 admin 对象,以便操作数据库结构:

Connection connection = ConnectionFactory.createConnection(config)
Admin admin = connection.getAdmin();

然后,我们可以通过将 HTableDescriptor 类的实例传递给 admin 对象的 createTable() 方法来创建一个表:

HTableDescriptor desc = new HTableDescriptor(table1);
desc.addFamily(new HColumnDescriptor(family1));
desc.addFamily(new HColumnDescriptor(family2));
admin.createTable(desc);

7. 添加和检索元素

随着表格的创建,我们可以通过创建一个 Put 对象并在 Table 对象上调用 put() 方法来向其中添加新数据:

byte[] row1 = Bytes.toBytes("row1")
Put p = new Put(row1);
p.addImmutable(family1.getBytes(), qualifier1, Bytes.toBytes("cell_data"));
table1.put(p);

通过使用 Get 类,我们可以检索先前创建的行:

Get g = new Get(row1);
Result r = table1.get(g);
byte[] value = r.getValue(family1.getBytes(), qualifier1);

row1 是行标识符——我们可以使用它从数据库中检索特定的行。当调用:

Bytes.bytesToString(value)

返回的结果将是之前插入的 cell_data.

8. 扫描和过滤

我们可以使用 Scan 对象扫描表格,通过指定资格器检索其中的所有元素(请注意,ResultScanner 继承自 Closable ,所以在完成时确保调用 *close()*):

Scan scan = new Scan();
scan.addColumn(family1.getBytes(), qualifier1);

ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
    System.out.println("Found row: " + result);
}

该操作将打印出 qualifier1 中的所有行,以及一些额外信息,如时间戳:

Found row: keyvalues={Row1/Family1:Qualifier1/1488202127489/Put/vlen=9/seqid=0}

我们可以通过过滤器检索特定记录。

首先,我们创建两个过滤器。filter1 指定扫描查询将检索大于 row1 的元素,而 filter2 指定我们只对资格器等于 qualifier1 的行感兴趣:

Filter filter1 = new PrefixFilter(row1);
Filter filter2 = new QualifierFilter(
  CompareOp.GREATER_OR_EQUAL, 
  new BinaryComparator(qualifier1));
List<Filter> filters = Arrays.asList(filter1, filter2);

然后,我们可以从 Scan 查询中获取结果集:

Scan scan = new Scan();
scan.setFilter(new FilterList(Operator.MUST_PASS_ALL, filters));

try (ResultScanner scanner = table.getScanner(scan)) {
    for (Result result : scanner) {
        System.out.println("Found row: " + result);
    }
}

当我们创建 FilterList 时,我们传递了一个 Operator.MUST_PASS_ALL ——这意味着所有过滤器都必须满足。如果我们只需要满足一个过滤器,可以选择 Operation.MUST_PASS_ONE。在结果集中,我们将只包含匹配指定过滤器的行。

9. 删除行

最后,要删除一行,我们可以使用 Delete 类:

Delete delete = new Delete(row1);
delete.addColumn(family1.getBytes(), qualifier1);
table.delete(delete);

我们正在删除位于 family1 中的 row1

10. 结论

在这篇快速教程中,我们专注于与HBase数据库的通信。我们了解了如何从Java客户端库连接到HBase,并执行各种基本操作。

所有这些示例和代码片段的实现可以在GitHub项目中找到;这是一个Maven项目,因此导入和运行起来应该很容易。


» 下一篇: JavaMoney 和货币API