Serverless HBase 使用说明

最近更新时间:2024-11-28 16:15:32

我的收藏

操作场景

通过 Shell、Java 以及 Golang 访问 EMR Serverless HBase 实例并进行建表和查询等操作。

准备工作

已经创建了一个 EMR Serverless HBase 实例且实例状态为运行中。
已经创建一台与 EMR Serverless HBase 实例同 VPC 和子网的 CVM 实例(后面简称 CVM 客户机)。
在 CVM 客户机上已安装 Java 环境并配置环境变量,安装要求 JDK1.8 以上版本,如未安装,获取安装并配置 Java 环境
已在 EMR Serverless HBase 实例信息页获取 Serverless HBase 实例的 Zookeeper 地址。
说明:
更多 HBase API 使用请查阅 Apache HBase 官网:https://hbase.apache.org/2.4/apidocs/index.html

使用 HBase Shell

配置环境

1. 登录 CVM 客户机,然后下载 HBase 客户端,解压并切换到 emr-serverless-hbase-client 目录。
cd /usr/local
wget https://emr-serverless-hbase-1259353343.cos.ap-guangzhou.myqcloud.com/emr-serverless-hbase-client.tar.gz
tar -zxvf emr-serverless-hbase-client.tar.gz
cd emr-serverless-hbase-client
2. 修改 conf/hbase-site.xml 中的 hbase.zookeeper.quorum 参数配置,$quorum 是 Zookeeper 地址。
vi conf/hbase-site.xml
<property>
<name>hbase.zookeeper.quorum</name>
<value>$quorum</value>
</property>

HBase 基本操作

1. 通过如下命令可以进入 HBase Shell。
./bin/hbase shell
2. 在 HBase shell 下输入 help 可以查看基本的使用信息和示例的指令。可以使用以下指令建立一个新表。
hbase:001:0> create 'test', 'cf'
Created table test
Took 1.5703 seconds
=> Hbase::Table - test
3. 表格建立后,可以使用 list 指令来查看您建立的表是否已经存在。
hbase:002:0> list 'test'
TABLE
test
1 row(s)
Took 0.0158 seconds
=> ["test"]
4. 使用 put 指令来为您创建的表加入数据。在创建的表中加入了三个值,第一次在“row1”行“cf:a”列插入了一个值“value1”,以此类推。
hbase:003:0> put 'test', 'row1', 'cf:a', 'value1'
Took 0.1766 seconds
hbase:004:0> put 'test', 'row2', 'cf:b', 'value2'
Took 0.0160 seconds
hbase:005:0> put 'test', 'row3', 'cf:c', 'value3'
Took 0.0149 seconds
5. 使用 scan 指令来遍历整个表。
hbase:006:0> scan 'test'
ROW COLUMN+CELL
row1 column=cf:a, timestamp=2024-07-16T10:56:28.027, value=value1
row2 column=cf:b, timestamp=2024-07-16T10:56:40.658, value=value2
row3 column=cf:c, timestamp=2024-07-16T10:56:51.744, value=value3
3 row(s)
Took 0.0682 seconds
6. 使用 get 指令来取得表中指定行的值。
hbase:007:0> get 'test', 'row1'
COLUMN CELL
cf:a timestamp=2024-07-16T10:56:28.027, value=value1
1 row(s)
Took 0.0361 seconds
7. 使用 drop 指令来删除一个表,在删除表之前需要先使用 disable 指令来禁用一个表。
hbase:008:0> disable 'test'
Took 0.6919 seconds
hbase:009:0> drop 'test'
Took 0.3451 seconds
8. 最后可以使用 exit 指令来关闭 HBase shell。

使用 Java API

确保开发环境下有合适的 JDK 版本,安装配置 Maven 的环境变量,如果您使用 IDE,请在 IDE 中设置 Maven 相关配置。如有需要,使用腾讯云镜像源加速Maven,在 Maven 配置文件 settings.xml 追加如下 repository mirror。
<mirror>
<id>nexus-tencentyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus tencentyun</name>
<url>http://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
</mirror>

新建一个Maven 工程

在命令行下进入您想要新建工程的目录,输入如下命令新建一个 Maven 工程。
mvn archetype:generate -DgroupId=com.tencent.cloud-DartifactId=test-serverless-hbase -Dversion=1.0 -DarchetypeArtifactId=maven-archetype-quickstart-DarchetypeVersion=1.1
创建成功后,在工程目录下就会生成一个名为 test-serverless-hbase 的工程文件夹。其中的文件结构如下所示。pom.xml 文件主要用于依赖管理和打包配置,Java 文件夹下放置您的源代码。
test-hbase
├── pom.xml
└── src
├── main
│ └── java
│ └── com
│ └── tencent
│ └── cloud
│ └── App.java
└── test
└── java
└── com
└── tencent
└── cloud
└── AppTest.java

添加配置和样例代码

在 pom.xml 文件中添加 Maven 依赖、打包和编译插件。
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.4.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>8</source>
<target>8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!-- 此处指定main方法入口的class -->
<mainClass>com.tencent.cloud.App</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
【可选】如果在之后的调试中遇到样例执行失败需要从标准输出中获取日志定位错误,或者您希望保存操作日志到指定目录 target/serverless-hbase.log,您可以在main 文件夹下创建 Java 配置文件目录 resources,创建 log4j.properties 文件并在 log4j.properties 文件中添加 log4j 日志信息打印模块的配置信息。
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/serverless-hbase.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
App.java 样例代码如下。
package com.tencent.cloud;
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;
/**
* 通过 HBase Java API 访问 Serverless HBase 实例
*/
public class App {
public static void main(String[] args) throws IOException {
// $quorum 在控制台实例信息页面通过访问方式模块 zookeeper 访问地址获取。
// 示例:conf.set("hbase.zookeeper.quorum", "10.0.0.8,10.0.0.11,10.0.0.5");
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "$quorum");
// 建立 EMR Lite HBase 客户端和数据之间的连接
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
// 连接建立后,可以使用HBase Java API 访问 Serverless HBase 实例。
TableDescriptorBuilder tableBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf("test1"));
ColumnFamilyDescriptor cf = ColumnFamilyDescriptorBuilder.of("cf");
tableBuilder.setColumnFamily(cf);
TableDescriptor table = tableBuilder.build();
System.out.println("Creating Table.");
if (admin.tableExists(table.getTableName())) {
admin.disableTable(table.getTableName());
admin.deleteTable(table.getTableName());
}
admin.createTable(table);
System.out.println("Inserting Data.");
Table table1 = connection.getTable(TableName.valueOf("test1"));
Put put1 = new Put(Bytes.toBytes("row1"));
put1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("a"),
Bytes.toBytes("value1"));

编译代码并打包上传

使用本地命令行进入工程目录,执行以下指令对工程进行编译打包。
mvn package
日志打印 build success 表示操作成功,在工程目录下的 target 文件夹中能够看到打包好的 jar 包,您需要将以 with-dependencies 为尾缀的 jar 包通过 CVM 实例控制台中的上传文件功能上传到 CVM 客户机中。
若 CVM 客户机可以通过公网 IP 访问,也可以在本地命令行模式下运行以下命令上传文件。
scp $localfile root@公网IP地址:$remotefolder
其中,$localfile 是您的本地文件的路径加名称,root 为 CVM 服务器用户名,公网 IP 可以在 CVM 客户机控制台查看。$remotefolder 是您想存放文件的 CVM 服务器路径。上传完成后,在 CVM 客户机命令行中即可查看对应文件夹下是否有相应文件。

执行样例并查看结果

登录 CVM 客户机,切换到对应文件夹下,使用如下命令执行样例。
java –jar $package.jar
运行代码,在控制台输出“Done”后,说明所有的操作已完成。您可以切换到 HBase shell 中通过 list 命令来查看使用 API 创建的 HBase 表是否成功,若成功可通过 scan 命令来查看表的具体内容。
hbase:001:0> list 'test1'
TABLE
test1
1 row(s)
Took 0.4315 seconds
=> ["test1"]
hbase:002:0> scan 'test1'
ROW COLUMN+CELL
row1 column=cf:a, timestamp=2024-07-16T16:20:38.685, value=value1
row2 column=cf:b, timestamp=2024-07-16T16:20:38.690, value=value2
row3 column=cf:c, timestamp=2024-07-16T16:20:38.695, value=value3
3 row(s)
Took 0.1231 seconds
hbase:003:0> exit

使用 Golang API

添加环境和样例代码

在 CVM 客户机上安装 Golang 并配置环境变量。以 go1.17.13 版本为例。
cd /usr/local
wget https://go.dev/dl/go1.17.13.linux-amd64.tar.gz
tar -zxvf go1.17.13.linux-amd64.tar.gz
vi /etc/profile
在/etc/profile中追加
export GO_HOME=/usr/local/go
export PATH=${GO_HOME}/bin:$PATH
后保存返回命令行
source /etc/profile
确保开发环境下有一致的 Golang 版本,进入工程目录,如果工程目录下没有 go.mod 文件,执行以下命令。
go mod init test-serverless-hbase
根据 Golang 版本下载 gohbase 依赖分支(查看 gohbase 项目地址)。
Golang Version
commit_id
1.22.x
731f0bdb6be56dfe0b5a5a79582161bc7fbed32b
1.18.x~1.21.x
1fee39f343954ca7501a6b8f25abd9f86eaf618b
1.13.x~1.17.x
05795eede1cb2442e6cc0313db93a4b544b49148
更多 Golang 版本对应的 Commit 可以在Commits · tsuna/gohbase · GitHub中查看。
go env -w GOPROXY=https://goproxy.cn
go get github.com/tsuna/gohbase@commit_id
# 以1.17.13版本为例:go get github.com/tsuna/gohbase@05795eede1cb2442e6cc0313db93a4b544b49148
在项目目录下创建样例代码文件 demo.go,此时工程目录结构如下。
test-serverless-hbase/
├── demo.go
├── go.mod
└── go.sum
demo.go 样例代码如下。
package main
import (
"context"
"fmt"
"github.com/tsuna/gohbase"
"github.com/tsuna/gohbase/hrpc"
"log"
)
func main() {
// $quorum 在控制台实例信息页面通过访问方式模块zookeeper访问地址获取。
// 示例:quorum := "10.0.0.8,10.0.0.11,10.0.0.5"
quorum := $quorum
// 创建表格
tableName := "test2"
var cfs = map[string]map[string]string{
"cf1": {
"MIN_VERSIONS": "1",
},
}
admin := gohbase.NewAdminClient(quorum)
crt := hrpc.NewCreateTable(context.Background(), []byte(tableName), cfs)
err := admin.CreateTable(crt)
if err != nil {
log.Fatal(err)
}
client := gohbase.NewClient(quorum)
// 写入数据
putRequest, err := hrpc.NewPutStr(context.Background(), tableName, "my_row_key", map[string]map[string][]byte{
"cf1": map[string][]byte{
"col1": []byte("value1"),
"col2": []byte("value2"),
},
})
if err != nil {
log.Fatal(err)
}

编译代码并打包上传

如果您当前的开发环境是 Linux 环境,请直接在命令行执行如下命令。
go build demo.go
如果是非 Linux 环境,请执行如下命令,打包成 Linux 文件后,切换原来的环境,确保其他文件正常编译。
go env -w GOOS=linux
go build demo.go
在工程目录下能够看到编译得到的二进制文件 demo,将该文件通过 CVM 实例控制台中的上传文件功能上传到 CVM 客户机中。
若 CVM 客户机可以通过公网 IP 访问,也可以在本地命令行模式下运行以下命令上传文件。
scp $localfile root@公网IP地址:$remotefolder
其中,$localfile 是您的本地文件的路径加名称,root 为 CVM 服务器用户名,公网 IP 可以在 CVM 客户机控制台查看。$remotefolder 是您想存放文件的 CVM 服务器路径。上传完成后,在 CVM 客户机命令行中即可查看对应文件夹下是否有相应文件。

执行样例并查看结果

切换到该文件所在的目标目录下,赋予该二进制文件可执行权限并执行。
chmod +x demo
./demo
运行代码后,切换到 HBase shell 中通过 list 命令来查看使用 API 创建的 HBase 表是否成功,若成功可通过 scan 命令来查看表的具体内容。
hbase:001:0> list 'test2'
TABLE
test2
1 row(s)
Took 0.3814 seconds
=> ["test2"]
hbase:002:0> scan 'test2'
ROW COLUMN+CELL
my_row_key column=cf1:col1, timestamp=2024-07-17T21:16:49.302, value=value1
my_row_key column=cf1:col2, timestamp=2024-07-17T21:16:49.302, value=value2
1 row(s)
Took 0.1268 seconds
hbase:003:0> exit