一、准备工作
·已经创建了一个 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。
二、配置环境
1. 登录 CVM 客户机,然后下载 HBase 客户端,解压并切换到 emr-serverless-hbase-client 目录。
cd /usr/localwget https://emr-serverless-hbase-1259353343.cos.ap-guangzhou.myqcloud.com/emr-serverless-hbase-client.tar.gztar -zxvf emr-serverless-hbase-client.tar.gzcd 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 testTook 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
创建成功后,在工程目录下就会生成一个名为 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, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d %p [%c] – %m%nlog4j.appender.logfile=org.apache.log4j.FileAppenderlog4j.appender.logfile.File=target/serverless-hbase.loglog4j.appender.logfile.layout=org.apache.log4j.PatternLayoutlog4j.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")); table1.put(put1); Put put2 = new Put(Bytes.toBytes("row2")); put2.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("b"),Bytes.toBytes("value2")); table1.put(put2); Put put3 = new Put(Bytes.toBytes("row3")); put3.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("c"),Bytes.toBytes("value3")); table1.put(put3); System.out.println(" Done."); }}
七、编译代码并打包上传
使用本地命令行进入工程目录,执行以下指令对工程进行编译打包。
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
九、添加环境和样例代码
在 CVM 客户机上安装 Golang 并配置环境变量。以 go1.17.13 版本为例。
cd /usr/localwget https://go.dev/dl/go1.17.13.linux-amd64.tar.gztar -zxvf go1.17.13.linux-amd64.tar.gzvi /etc/profile 在/etc/profile中追加export GO_HOME=/usr/local/goexport 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.cngo 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"), }, }) _, err = client.Put(putRequest) if err != nil { log.Fatalf("Failed to put data into HBase: %v", err) } fmt.Println("数据写入 HBase 成功!") // 关闭客户端连接 client.Close()}
十、编译代码并打包上传
如果你当前的开发环境是 Linux 环境,请直接在命令行执行如下命令。
go build demo.go
如果是非 Linux 环境,请执行如下命令,打包成 Linux 文件后,切换原来的环境,确保其他文件正常编译。
go env -w GOOS=linuxgo 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