Apache HBase
- Apache HBase是Hadoop database,属于Hadoop生态系统。
- 自从十四年前Google相继发布论文:《The Google File System》、《MapReduce: Simplified Data Processing on Large Clusters》和《Bigtable: A Distributed Storage System for Structured Data》后,开源界开始模仿论文设计开源版本的这三个系统,其中佼佼者就是Hadoop生态,分别对应于Hadoop,HDFS和HBase。
- 经过十几年业界大规模的使用和锤炼,目前Hadoop生态已经成为一种事实上的业界规范,导致NoSQL的鼻祖Google的Bigtable都支持HBase wrapper,提供了Bigtable HBase client。
Tablestore
- Tablestore,中文名表格存储,是阿里云自主研发的NoSQL数据库,不同于HBase使用了Java,表格存储和Bigtable一样使用了C++语言来开发。
- 作为同类型的NoSQL数据库,HBase的大部分功能也同样存在于表格存储中,甚至大部分场景下性能更优,但是表格存储还是不同于HBase,有部分高级功能,HBase并不拥有,这个后面单独文章介绍。
HBase client
- HBase client是HBase提供的便于用户访问HBase的客户端,支持读、写、扫描、批量、表管理等功能。
场景
Hadoop生态作为长久以来唯一的开源大数据解决方案,被广泛用于各个公司中。目前,大部分自建数据处理系统的公司使用了HBase等Hadoop生态的系统。当这部分用户想将数据迁移到阿里云的NoSQL数据库表格存储时,之前都需要用户重写客户端代码才能使用表格存储,虽然这种方式性能更好,对后续的使用也更友好的,但是还是初期比较耗时间,为了解决这个问题,表格存储年前也推出了TableStore HBase client。
如何使用
用户如果之前使用HBase Client访问HBase,现在只需要在项目中将对HBase Client的依赖 修改为对Tablestore HBase client的依赖,同时修改hbase-site.xml中的hbase.client.connection.impl值为com.alicloud.tablestore.hbase.TablestoreConnection即可。其他代码都不需要任何改动。
例子
代码位置
当前示例程序使用了HBase API访问表格存储服务,完整的示例程序位于Github的Aliyun Tablestore HBase client for Java项目中,目录位置是src/test/java/samples/HelloWorld.java。
配置项目依赖
Maven的依赖配置如下:
<dependencies>
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>tablestore-hbase-client</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
配置文件
hbase-site.xml中增加下列配置项:
<configuration>
<property>
<name>hbase.client.connection.impl</name>
<value>com.alicloud.tablestore.hbase.TablestoreConnection</value>
</property>
<property>
<name>tablestore.client.endpoint</name>
<value>endpoint</value>
</property>
<property>
<name>tablestore.client.instancename</name>
<value>instance_name</value>
</property>
<property>
<name>tablestore.client.accesskeyid</name>
<value>access_key_id</value>
</property>
<property>
<name>tablestore.client.accesskeysecret</name>
<value>access_key_secret</value>
</property>
<property>
<name>hbase.client.tablestore.family</name>
<value>f1</value>
</property>
<property>
<name>hbase.client.tablestore.table</name>
<value>ots_adaptor</value>
</property>
</configuration>
连接表格存储
通过创建一个TableStoreConnection对象链接表格存储服务。
Configuration config = HBaseConfiguration.create();
// 创建一个Tablestore Connection
Connection connection = ConnectionFactory.createConnection(config);
// Admin 负责创建、管理、删除等
Admin admin = connection.getAdmin();
创建表
通过指定表名创建一张表,MaxVersion和TimeToLive都是用默认值。
// 创建一个HTableDescriptor,只有一个列族
HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf(TABLE_NAME));
// 创建一个列族,MaxVersion和TimeToLive使用默认值,MaxVersion默认值是1,TimeToLive默认值是Integer.INF_MAX。
descriptor.addFamily(new HColumnDescriptor(COLUMN_FAMILY_NAME));
// 通过Admin的createTable接口创建表
System.out.println("Create table " + descriptor.getNameAsString());
admin.createTable(descriptor);
写数据
写入一行数据到表格存储。
// 创建一个TablestoreTable,用于单个表上的读写更新删除等操作
Table table = connection.getTable(TableName.valueOf(TABLE_NAME));
// 创建一个Put对象,主键是row_1
System.out.println("Write one row to the table");
Put put = new Put(ROW_KEY);
// 增加一列,表格存储只支持单列族,列族名称在hbase-site.xml中配置,如果没有配置默认是“f”,所以写入数据时COLUMN_FAMILY_NAME可以是空值
put.addColumn(COLUMN_FAMILY_NAME, COLUMN_NAME, COLUMN_VALUE);
// 执行Table的put操作,使用Hbase API将这一行数据写入表格存储
table.put(put);
读数据
读取指定行的数据。
// 创建一个Get对象,读取主键为ROW_KEY的行
Result getResult = table.get(new Get(ROW_KEY));
Result result = table.get(get);
// 打印结果
String value = Bytes.toString(getResult.getValue(COLUMN_FAMILY_NAME, COLUMN_NAME));
System.out.println("Get one row by row key");
System.out.printf("\t%s = %s\n", Bytes.toString(ROW_KEY), value);
扫描数据
范围读取数据。
扫描全表所有行数据
System.out.println("Scan for all rows:");
Scan scan = new Scan();
ResultScanner scanner = table.getScanner(scan);
// 循环打印结果
for (Result row : scanner) {
byte[] valueBytes = row.getValue(COLUMN_FAMILY_NAME, COLUMN_NAME);
System.out.println('\t' + Bytes.toString(valueBytes));
}
删表
使用Admin API删除一张表。
print("Delete the table");
admin.disableTable(table.getName());
admin.deleteTable(table.getName());
完结
按照上面的步骤就可以使用Tablestore HBase client了,目前,已经有用户开始使用,后续,我们会根据用户的反馈持续优化Tablestore HBase client,使其性能能追赶到原生的表格存储(Tablestore)。
虽然通过Tablestore HBase Client也可以访问表格存储,但是还是建议用户直接使用表格存储的SDK访问表格存储,这样性能更好,功能更多,价格更便宜。表格存储的官方网站:https://cn.aliyun.com/product/ots