友情链接:
本篇内容仅展示快速上手所使用的部分SQL命令,并以银行客户信息表为场景介绍Hyperbase中的SQL快速入门使用方法,不代表Hyperbase仅支持该部分命令。如需查看完整详细的操作语句及参数说明请查看《Hyperbase使用手册》。
Transwarp HyperbaseNoSQL宽表数据库是一个具有高可靠,高性能,可伸缩,实时读写,并且面向列的一个分布式NewSQL数据库,其既具有NoSQL数据库的海量数据存储管理能力,同时又继承了关系型数据库的SQL特性,列式存储的特性使得了其对Schema限制很少,可以自由添加列,适合存储海量的半结构化数据。
Hyperbase同时也是一个Key-Value数据库,按Key的字典序顺序存储,主要通过Key实现数据的增删改查以及扫库操作。Hyperbas采用HDFS为文件存储系统,可以高效的支持各类如批处理应用、全局搜索或高并发图形数据库检索应用等等。
注意,社区版用户需要确保已经上传并安装好Hyperbase的产品包,并申请了对应的许可证 (TDH基础安装包安装完成后申请的许可证内不含有Hyperbase的许可证,因此,社区版用户需要在新上传其他子产品后再次执行申请许可证的步骤方可生成对应产品的许可证)
Hyperbase安装视频
打开 Hyperbase Active Master 管理页面的方法有两种:
A)根据集群的active master的ip地址打开: http://master_node_ip:60010 。如下图
B)通过 TDH 管理页面中 Hyperbase 服务的 HMaster 的 Service Link 打开,详细流程如下:
页面左上角服务名后的圆点颜色表示集群中的 Hyperbase 服务的状态,比如当前是绿色的 Green(HEALTHY) ,健康状态。另两种状态是 Yellow(WARNING) 和 Red(DOWN)。
通过每个 HMaster 对应的 Service Link 可以打开 HMaster 管理页面。如下图:
若打开的 Master 并非当前集群的 Active Master,可点击页面左上角 Master 下的 shiva01 的链接,即为 Active Master 的管理页面 。
Active Master 的管理页面 主要包含 Region Servers, Backup Masters, Tables, Tasks 等相关信息。下面将主要介绍一些常见操作。
Hyperbase 主页面的第一块区域包含 Hyperbase 集群的所有 Region Server 的信息: Base Stats, Memory, Requests, Storefiles, Compactions。
其中,每个 ServerName 的链接如 RegionServer shiva01,60020,1480995863625 ,对应相应 Region Server 的管理页面,可查看更详细的信息。
同样可以通过 Hyperbase 角色页面每个 Region Server 对应的 Service Link 都可以直接链接到对应 Server 的 Web 管理页面。
Hyperbase主页面的第一块区域包含Backup Masters的信息:ServerName, Port, Start Time等。打开ServerName下的链接可以链接到对应节点的管理页面,如 shiva02 管理页面。
包含Hyperbase中所有的表:User Tables,Catalog Tables和Snapshots。这里将主要介绍User Tables和Catalog Tables中的hbase:meta表。
i) User Tables
包含Hyperbase中所有的用户表,并且可以查看表名,Region数目和表的元数据
并且可以点击 Details 链接查看所有用户表的不同Region所在的Region Server,以及起止的Row Key。如下图:
ii) hbase:meta表
Catalog Tables中包含三个特殊的表:hbase:meta表,hbase:namespace表和hbase:snapshot表。如下图:
打开hbase:meta的链接如下图:
可以查看到hbase:meta表所在的Region Server是 shiva01:60030 ,以及一些其他相关信息。
和Hyperbase交互有以下三种方式:
1. SQL(推荐方式):
和Hyperbase交互推荐使用SQL,您在链接上Inceptor engine后即可使用SQL进行数据库操作。
我们的SQL引擎Inceptor Engine提供了丰富的SQL语法,并对SQL的执行进行了充分的优化,使用SQL和Hyperbase交互在正确性和性能方面都有很好的保证。 您可以在链接数据库以及SQL参考章节详细了解链接数据库的教程以及Inceptor支持的SQL语法。
2. Shell:
Hyperbase提供交互式Shell以及一系列Shell指令用于数据操作,细节请参考Hyperbase Shell命令。
a)在 Hyperbase Client 执行 hbase shell : Hyperbase Client 集成在 TDH-Client 中,需要执行以下命令(开安全)
source ./TDH-Client/init.sh
kinit -kt /etc/hypberase1/conf/hyperbase.keytab hbase/${hostname}
hbase shell
b)在服务 pod 中执行 hbase shell (开安全):
kubectl exec -it hmasterPodName bash
export HBASE_OPTS="-Djava.security.auth.login.config=/etc/hyperbase1/conf/jaas.conf"
kinit -kt /etc/hyperbase1/conf/hyperbase.keytab hbase/${hostname}
hbase shell
3. Java API:
Hyperbase支持Apache Hyperbase原生的API,同时还提供多种自有的API,细节请参考Hyperbase API使用说明。
Hyperbase支持创建两种格式的表 Hyperbase表 以及 Hyperdrive表,以下是他们的对比及区别。
表类 | Hyperbase表 | Hyperdrive表 |
---|---|---|
背景 | 基于开源Hive HBaseStorageHandler研发 | 星环自主研发,更贴合Inceptor的设计,性能更优 |
优势 | 简单 | 优化语句、支持多种数据类型、数据存储压缩率高。详见下文 |
劣势 | 缺少Schema信息,一些SQL功能支持不好,无法做一些性能优化 | 附带Schema信息,直接操作底层Hyperbase表较复杂 |
适用场景 | Inceptor对接Hyperbase外表 | Inceptor建内表 |
Hyperbase表
Hyperdrive表
为了解决Hyperbase表的一些设计缺陷,星环科技自主研发了Hyperdrive表,去除了开源Hive HBaseStorageHandler的设计,并增加了新的功能,使其能更高效地通过Inceptor访问存储在Hyperbase中的数据。
其他通用功能
Hyperbase表和Hyperdrive表均具备以下星环科技自研功能:
Hyperbase SQL 分为DDL、index DDL、DML和DQL四部分。本章节将以银行客户信息表为例介绍Hyperbase SQL 的建表、建索引、插入数据和数据查询等基本操作。其他详细操作请参考《Hyperbase使用手册》。
由前文介绍可知,hbase表有内外表之分,两者的建表语句也存在一定的差别,下面将分别介绍:
CREATE TABLE <tableName> (
<key> <data_type>,
<column> <data_type>,
<column> <data_type>,
...
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' --[1]
[WITH SERDEPROPERTIES('hbase.columns.mapping'=':key,<f1:c1>,<f1:c2>,...')] --[2]
[TBLPROPERTIES ("hbase.table.name"="<hbase_table>")]; --[3]
为帮助您更好的理解Hyperbase内表,下面我们将通过建Hyperbase内表语法创建一张银行客户信息内表
create table hbase_inner_table(
key1 string,
name string,
password string,
email string,
cellphone string,
balance double
)STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler';
BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, DATE, TIMESTAMP, FLOAT, DOUBLE, STRING, VARCHAR, DECIMAL 和 STRUCT。
所有数据类型映射在实际 Hyperbase 表中的类型都是 byte[]。
具体数据类型的相关介绍请参考Inceptor支持的数据类型。
建表后可通过 DESCRIBE FORMATTED 查看 hbase_inner_table 的元数据信息,确认是否创建成功。如下:
describe formatted hbase_inner_table;
由上图可见,hbase_inner_table表的列名、数据类型、映射关系等等。
CREATE EXTERNAL TABLE <tableName> (
<key> <data_type>,
<column> <data_type>,
<column> <data_type>,
...
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES('hbase.columns.mapping'=':key,<f:q1>,<f:q2>,...') --[1]
TBLPROPERTIES ("hbase.table.name"="<hbase_table>"); --[2]
CREATE EXTERNAL TABLE hbase_external_table(
key1 string,
ex1 double,
ex3 date,
ex5 string
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping"=":key,f:q1,f:q4,f:q5") --[1]
TBLPROPERTIES ("hbase.table.name"="test.hbase_inner_table"); --[2]
建表后可通过 DESCRIBE FORMATTED 查看 hbase_inner_table 的元数据信息,确认是否创建成功。如下:
describe formatted hbase_external_table;
由上图可见,hbase_external_table表的列名、数据类型、映射关系等等。
Hyperbase SQL的Index DDL支持创建和删除表的全局索引和全文索引,包括:
创建索引:CREATE INDEX
删除索引:DROP INDEX
Hyperbase表只支持创建全局索引(GLOBAL INDEX) 和全文索引(FULLTEXT INDEX),下面将分别介绍。
CREATE GLOBAL INDEX <index_name> ON <tableName> (
<column1> <SEGMENT LENGTH length1>|<(length1)> --[1]
[,<column2> <SEGMENT LENGTH length2>|<(length2)>,...] --[2]
);
--根据name列创建一个名为name_global的全局索引,并指定该索引字段长度为10
CREATE GLOBAL INDEX name_global ON hbase_inner_table(name(10));
CREATE FULLTEXT INDEX ON <tableName> ( --[1]
<column1> [DOCVALUES <TRUE|FALSE>] --[2]
[,<column2> [DOCVALUES <TRUE|FALSE>],...] --[3]
)SHARD NUM <n>; --[4]
--为内表hbase_inner_table根据列name、balance来创建全文索引
CREATE FULLTEXT INDEX ON hbase_inner_table(name,balance) SHARD NUM 1;
因一张表可以有多个全局索引,所以需要指定索引名:index_name
DROP INDEX [IF EXISTS] <index_name> ON <tableName>;
DROP INDEX name_global ON hbase_inner_table;
因一张表只有一个全文索引,所以只需指定表名
DROP FULLTEXT INDEX [IF EXISTS] ON <tableName>;
Hyperbase SQL中的DML(Data Manipulation Language)包括:
下面将一一介绍。
Hyperbase SQL 支持向Hyperbase表中单条插入数据或者批量插入查询结果。
单条插入数据语法一次只可插入一条记录,具体语法如下:
INSERT INTO TABLE <tableName> [(<column1>, <column2>, ...)] VALUES (<value1>, <value2>, ...);
INSERT INTO TABLE hbase_inner_table VALUES ('1','Alice','Alice123','Alice@126.com', '12341234123', 10000.0);
INSERT INTO TABLE hbase_inner_table VALUES ('2','Bob','Bob123','Bob@126.com','13571357135', 20000.0);
不同于单条插入语法一次只能插入一条记录,批量插入语法可一次性插入任意多条记录。具体语法如下:
BATCHINSERT INTO <tableName> [(<column1>, <column2>, ...)] BATCHVALUES(VALUES(<value1>, <value2>, ...), VALUES(<value1>, <value2>,...),...);
BATCHINSERT INTO hbase_inner_table BATCHVALUES (
VALUES('3','Carol','Carol123','Carol@126.com','12345234523', 30000.0),
VALUES('4','Derek','Derek123','Derek@126.com','13456345634', 40000.0));
select * from hbase_inner_table;
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
| 2 | Bob | Bob123 | Bob@126.com | 13571357135 | 20000.0 |
| 3 | Carol | Carol123 | Carol@126.com | 12345234523 | 30000.0 |
| 4 | Derek | Derek123 | Derek@126.com | 13456345634 | 40000.0 |
+-----+-------+----------+---------------+-------------+---------+
并且,从hbase_external_table中也可以查询到上述数据,因两者映射Hyperbase中的同一张表。
数据插入后可以通过UPDATE语法来更新数据
UPDATE <tableName> SET <column> = <value> WHERE <filter_conditions>;
UPDATE hbase_inner_table SET balance = 50000.0 WHERE name = 'Carol';
数据插入后可以通过DELETE语句来删除数据
DELETE FROM <tableName> WHERE <filter_conditions>;
DELETE FROM hbase_inner_table WHERE key1 = '4';
指定全局索引和全文索引进行查询,只有在 local mode 下才会生效,该模式的参数设置如下:
设置local mode
set ngmr.exec.mode = local;
该参数设置完成后才能利用索引进行有效的查询。
下面我们分别介绍对hyperbase映射表指定全局索引和全文索引进行查询的语法。而全局索引和全文索引如何创建请参考前文的介绍。
SELECT /*+USE_INDEX(<table_alias> USING <index_name>)*/... --[1]
FROM <tableName> <table_alias> --[2]
WHERE <filter_conditions>; --[3]
下面将以前文创建的全局索引name_global举例如何查询。
SELECT /*+USE_INDEX(t USING name_global)*/ * FROM hbase_inner_table t WHERE t.name = 'Alice';
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
+-----+-------+----------+---------------+-------------+---------+
若用户想对含全局索引的表做普通的查询时,需明确指定不使用任何索引
SELECT /*+USE_INDEX(<table_alias> USING NOT_USE_INDEX)*/ ... FROM <tableName> <table_alias> WHERE <filter_condition>;
SELECT /*+USE_INDEX(t USING NOT_USE_INDEx)*/ * FROM hbase_inner_table t WHERE t.name = 'Alice';
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
+-----+-------+----------+---------------+-------------+---------+
Hyperbase表的全文索引通过CONTAINS函数使用,目前支持精准匹配,前缀查询,模糊查询和范围查询四种语义,支持检索条件的逻辑组合。
SELECT ... FROM <tableName>
WHERE CONTAINS (<column>, "<fulltext_query>") --[1]
[AND|OR CONTAINS(<column>, "<fulltext_query>") AND|OR CONTAINS(<column>, "<fulltext_query>")...]; --[2]
"<operator> '<search_contents>' [and|or <operator> '<search_contents>' and|or <operator> '<search_contents>'...]"
其中,<operator> 为全文检索运算符, '<search_contents>' 为检索内容(注意单引号)。一个全文检索条件可以由多个 <operator> <search_contents> 组成,之间用 and 或 or 连接。 全文检索操作符<OPERATOR>包括:
操作符 | 支持的数据类型 | |
---|---|---|
精确匹配 | term | 所有数据类型 |
前缀查询 | prefix | STRING类型 |
正则表达式 | regexp | STRING类型 |
模糊查询 | wildcard | STRING类型 |
全文搜索 | match | STRING类型 |
in查询 | in | 所有数据类型 |
范围查询 | range | 所有数据类型 |
> | 所有数据类型 | |
< | 所有数据类型 | |
>= | 所有数据类型 | |
<= | 所有数据类型 |
下面给出几个具体事例。
select * from hbase_inner_table where contains(name, "term 'Alice'");
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
+-----+-------+----------+---------------+-------------+---------+
select * from hbase_inner_table where contains(balance, "range '[10000,30000)'");
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
| 2 | Bob | Bob123 | Bob@126.com | 13571357135 | 20000.0 |
+-----+-------+----------+---------------+-------------+---------+
Hyperdrive SQL 分为DDL、index DDL、DML和DQL四部分。 本章节将以银行信息表为例介绍Hyperdrive SQL 的建表、建索引、插入数据和数据查询等基本操作。其他详细操作请参考《Hyperbase使用手册》
建Hyperdrive我们推荐使用较简单的方法。
CREATE TABLE <tableName> (
<key> <data_type>,
<column> <data_type>,
<column> <data_type>,
...
)
STORED AS HYPERDRIVE; --[1]
Hyperdrive表支持的数据类型包括: BOOLEAN、 TINYINT、 SMALLINT、 INTEGER、 BIGINT、 DATE、 TIMESTAMP、 DECIMAL、 FLOAT、 DOUBLE、 STRING、 VARCHAR和STRUCT,有自己的编码和解码方式,解决了 NULL 等特殊类型在Hyperbase中的表示。
create table hd_inner_table(
key1 string,
name string,
password string,
email string,
cellphone string,
balance double
)STORED AS HYPERDRIVE;
建表后可通过 DESCRIBE FORMATTED 查看 hd_inner_table 的元数据信息,确认是否创建成功。如下:
describe formatted hd_inner_table;
因外表众多功能无法实现,不推荐建Hyperdrive外表。
索引相关的DDL语法包括创建和删除hyperdrive表的全局索引和全文索引:
创建索引:CREATE INDEX
删除索引:DROP INDEX
下面将具体介绍创建和删除索引的语法。
CREATE GLOBAL INDEX <index_name> ON <tableName> (
<column1> [SEGMENT LENGTH length1]|[(length1)] --[1]
[,<column2> [SEGMENT LENGTH length2]|[(length2)],...] --[2]
);
下面将以hd_inner_table表为例,创建全局索引。
CREATE GLOBAL INDEX name_balance_global_index ON hd_inner_table(name(10), balance);
-- 因列name是string类型,因此需要指定长度
CREATE FULLTEXT INDEX ON <tableName> ( --[1]
<column1> [DOCVALUES <TRUE|FALSE>] --[2]
[,<column2> [DOCVALUES <TRUE|FALSE>],...] --[3]
)SHARD NUM <n>; --[4]
CREATE FULLTEXT INDEX ON hd_inner_table(name,balance) SHARD NUM 1;
--为内表hd_inner_table根据列name、balance来创建全文索引,一个分片
建全文索引无需指定STRING类型的字段长度
因一张表可以有多个全局索引,所以需要指定索引名:index_name。
DROP INDEX [IF EXISTS] <index_name> ON <tableName>;
DROP INDEX name_balance_global_index ON hd_inner_table;
--删除创建的全局索引 name_balance_global_index
Hyperdrive SQL中的DML(Data Manipulation Language)包括:
下面将一一介绍。
Hyperdrive SQL 支持向Hyperbase表中单条插入数据或者批量插入查询结果。
单条插入数据语法一次只可插入一条记录,具体如下:
INSERT INTO TABLE <tableName> [(<column1>, <column2>, ...)] VALUES (<value1>, <value2>, ...);
INSERT INTO TABLE hd_inner_table VALUES ('1','Alice','Alice123','Alice@126.com', '12341234123', 10000.0);
INSERT INTO TABLE hd_inner_table VALUES ('2','Bob','Bob123','Bob@126.com','13571357135', 20000.0);
不同于单条插入语法一次只能插入一条记录,批量插入语法可一次性插入任意多条记录,具体如下:
BATCHINSERT INTO <tableName> [(<column1>, <column2>, ...)] BATCHVALUES(VALUES(<value1>, <value2>, ...), VALUES(<value1>, <value2>,...),...);
BATCHINSERT INTO hd_inner_table BATCHVALUES (
VALUES('3','Carol','Carol123','Carol@126.com','12345234523', 30000.0),
VALUES('4','Derek','Derek123','Derek@126.com','13456345634', 40000.0));
数据插入后可以通过UPDATE语法来更新数据,具体如下:
UPDATE <tableName> SET <column> = <value> WHERE <filter_conditions>;
UPDATE hd_inner_table SET balance = 50000.0 WHERE name = 'Carol';
数据插入后可以通过DELETE语句来删除数据,具体如下:
DELETE FROM <tableName> WHERE <filter_conditions>;
DELETE FROM hd_inner_table WHERE key1 = '4';
指定全局索引和全文索引进行查询,只有在 local mode 下才会生效,该模式的参数设置如下:
设置local mode
set ngmr.exec.mode = local;
该参数设置完成后才能利用索引进行有效的查询
SELECT /*+USE_INDEX(<table_alias> USING <index_name>)*/... --[1]
FROM <tableName> <table_alias> --[2]
WHERE <filter_conditions>; --[3]
SELECT /*+USE_INDEX(t USING name_balance_global_index)*/ * FROM hd_inner_table t WHERE t.name = 'Alice';
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
+-----+-------+----------+---------------+-------------+---------+
利用全局索引 name_balance_global_index 查询满足条件:t.name = 'Alice’的数据
使用索引查询时必须要给表起化名,并在指定索引时使用表化名。
SELECT /*+USE_INDEX(<table_alias> USING NOT_USE_INDEX)*/ ... FROM <tableName> <table_alias> WHERE <filter_condition>;
SELECT /*+USE_INDEX(t using NOT_USE_INDEX)*/ * FROM hd_inner_table t WHERE t.name = 'Alice';
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
+-----+-------+----------+---------------+-------------+---------+
明确不使用索引查询满足条件:t.name = 'Alice’的数据
SELECT /*+USE_INDEX(<table_alias> USING FULLTEXT)*/ ... FROM <table> <table_alias> WHERE <filter_conditions>;
SELECT /*+USE_INDEX(t USING FULLTEXT)*/ * FROM hd_inner_table t WHERE t.name = 'Alice';
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
+-----+-------+----------+---------------+-------------+---------+
利用全文索引查询满足条件:t.name = 'Alice’的数据。
如果上述内容对您有提供帮助,欢迎多多点赞支持~😎
友情链接:
本篇内容仅展示快速上手所使用的部分SQL命令,并以银行客户信息表为场景介绍Hyperbase中的SQL快速入门使用方法,不代表Hyperbase仅支持该部分命令。如需查看完整详细的操作语句及参数说明请查看《Hyperbase使用手册》。
Transwarp HyperbaseNoSQL宽表数据库是一个具有高可靠,高性能,可伸缩,实时读写,并且面向列的一个分布式NewSQL数据库,其既具有NoSQL数据库的海量数据存储管理能力,同时又继承了关系型数据库的SQL特性,列式存储的特性使得了其对Schema限制很少,可以自由添加列,适合存储海量的半结构化数据。
Hyperbase同时也是一个Key-Value数据库,按Key的字典序顺序存储,主要通过Key实现数据的增删改查以及扫库操作。Hyperbas采用HDFS为文件存储系统,可以高效的支持各类如批处理应用、全局搜索或高并发图形数据库检索应用等等。
注意,社区版用户需要确保已经上传并安装好Hyperbase的产品包,并申请了对应的许可证 (TDH基础安装包安装完成后申请的许可证内不含有Hyperbase的许可证,因此,社区版用户需要在新上传其他子产品后再次执行申请许可证的步骤方可生成对应产品的许可证)
Hyperbase安装视频
打开 Hyperbase Active Master 管理页面的方法有两种:
A)根据集群的active master的ip地址打开: http://master_node_ip:60010 。如下图
B)通过 TDH 管理页面中 Hyperbase 服务的 HMaster 的 Service Link 打开,详细流程如下:
页面左上角服务名后的圆点颜色表示集群中的 Hyperbase 服务的状态,比如当前是绿色的 Green(HEALTHY) ,健康状态。另两种状态是 Yellow(WARNING) 和 Red(DOWN)。
通过每个 HMaster 对应的 Service Link 可以打开 HMaster 管理页面。如下图:
若打开的 Master 并非当前集群的 Active Master,可点击页面左上角 Master 下的 shiva01 的链接,即为 Active Master 的管理页面 。
Active Master 的管理页面 主要包含 Region Servers, Backup Masters, Tables, Tasks 等相关信息。下面将主要介绍一些常见操作。
Hyperbase 主页面的第一块区域包含 Hyperbase 集群的所有 Region Server 的信息: Base Stats, Memory, Requests, Storefiles, Compactions。
其中,每个 ServerName 的链接如 RegionServer shiva01,60020,1480995863625 ,对应相应 Region Server 的管理页面,可查看更详细的信息。
同样可以通过 Hyperbase 角色页面每个 Region Server 对应的 Service Link 都可以直接链接到对应 Server 的 Web 管理页面。
Hyperbase主页面的第一块区域包含Backup Masters的信息:ServerName, Port, Start Time等。打开ServerName下的链接可以链接到对应节点的管理页面,如 shiva02 管理页面。
包含Hyperbase中所有的表:User Tables,Catalog Tables和Snapshots。这里将主要介绍User Tables和Catalog Tables中的hbase:meta表。
i) User Tables
包含Hyperbase中所有的用户表,并且可以查看表名,Region数目和表的元数据
并且可以点击 Details 链接查看所有用户表的不同Region所在的Region Server,以及起止的Row Key。如下图:
ii) hbase:meta表
Catalog Tables中包含三个特殊的表:hbase:meta表,hbase:namespace表和hbase:snapshot表。如下图:
打开hbase:meta的链接如下图:
可以查看到hbase:meta表所在的Region Server是 shiva01:60030 ,以及一些其他相关信息。
和Hyperbase交互有以下三种方式:
1. SQL(推荐方式):
和Hyperbase交互推荐使用SQL,您在链接上Inceptor engine后即可使用SQL进行数据库操作。
我们的SQL引擎Inceptor Engine提供了丰富的SQL语法,并对SQL的执行进行了充分的优化,使用SQL和Hyperbase交互在正确性和性能方面都有很好的保证。 您可以在链接数据库以及SQL参考章节详细了解链接数据库的教程以及Inceptor支持的SQL语法。
2. Shell:
Hyperbase提供交互式Shell以及一系列Shell指令用于数据操作,细节请参考Hyperbase Shell命令。
a)在 Hyperbase Client 执行 hbase shell : Hyperbase Client 集成在 TDH-Client 中,需要执行以下命令(开安全)
source ./TDH-Client/init.sh
kinit -kt /etc/hypberase1/conf/hyperbase.keytab hbase/${hostname}
hbase shell
b)在服务 pod 中执行 hbase shell (开安全):
kubectl exec -it hmasterPodName bash
export HBASE_OPTS="-Djava.security.auth.login.config=/etc/hyperbase1/conf/jaas.conf"
kinit -kt /etc/hyperbase1/conf/hyperbase.keytab hbase/${hostname}
hbase shell
3. Java API:
Hyperbase支持Apache Hyperbase原生的API,同时还提供多种自有的API,细节请参考Hyperbase API使用说明。
Hyperbase支持创建两种格式的表 Hyperbase表 以及 Hyperdrive表,以下是他们的对比及区别。
表类 | Hyperbase表 | Hyperdrive表 |
---|---|---|
背景 | 基于开源Hive HBaseStorageHandler研发 | 星环自主研发,更贴合Inceptor的设计,性能更优 |
优势 | 简单 | 优化语句、支持多种数据类型、数据存储压缩率高。详见下文 |
劣势 | 缺少Schema信息,一些SQL功能支持不好,无法做一些性能优化 | 附带Schema信息,直接操作底层Hyperbase表较复杂 |
适用场景 | Inceptor对接Hyperbase外表 | Inceptor建内表 |
Hyperbase表
Hyperdrive表
为了解决Hyperbase表的一些设计缺陷,星环科技自主研发了Hyperdrive表,去除了开源Hive HBaseStorageHandler的设计,并增加了新的功能,使其能更高效地通过Inceptor访问存储在Hyperbase中的数据。
其他通用功能
Hyperbase表和Hyperdrive表均具备以下星环科技自研功能:
Hyperbase SQL 分为DDL、index DDL、DML和DQL四部分。本章节将以银行客户信息表为例介绍Hyperbase SQL 的建表、建索引、插入数据和数据查询等基本操作。其他详细操作请参考《Hyperbase使用手册》。
由前文介绍可知,hbase表有内外表之分,两者的建表语句也存在一定的差别,下面将分别介绍:
CREATE TABLE <tableName> (
<key> <data_type>,
<column> <data_type>,
<column> <data_type>,
...
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' --[1]
[WITH SERDEPROPERTIES('hbase.columns.mapping'=':key,<f1:c1>,<f1:c2>,...')] --[2]
[TBLPROPERTIES ("hbase.table.name"="<hbase_table>")]; --[3]
为帮助您更好的理解Hyperbase内表,下面我们将通过建Hyperbase内表语法创建一张银行客户信息内表
create table hbase_inner_table(
key1 string,
name string,
password string,
email string,
cellphone string,
balance double
)STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler';
BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, DATE, TIMESTAMP, FLOAT, DOUBLE, STRING, VARCHAR, DECIMAL 和 STRUCT。
所有数据类型映射在实际 Hyperbase 表中的类型都是 byte[]。
具体数据类型的相关介绍请参考Inceptor支持的数据类型。
建表后可通过 DESCRIBE FORMATTED 查看 hbase_inner_table 的元数据信息,确认是否创建成功。如下:
describe formatted hbase_inner_table;
由上图可见,hbase_inner_table表的列名、数据类型、映射关系等等。
CREATE EXTERNAL TABLE <tableName> (
<key> <data_type>,
<column> <data_type>,
<column> <data_type>,
...
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES('hbase.columns.mapping'=':key,<f:q1>,<f:q2>,...') --[1]
TBLPROPERTIES ("hbase.table.name"="<hbase_table>"); --[2]
CREATE EXTERNAL TABLE hbase_external_table(
key1 string,
ex1 double,
ex3 date,
ex5 string
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping"=":key,f:q1,f:q4,f:q5") --[1]
TBLPROPERTIES ("hbase.table.name"="test.hbase_inner_table"); --[2]
建表后可通过 DESCRIBE FORMATTED 查看 hbase_inner_table 的元数据信息,确认是否创建成功。如下:
describe formatted hbase_external_table;
由上图可见,hbase_external_table表的列名、数据类型、映射关系等等。
Hyperbase SQL的Index DDL支持创建和删除表的全局索引和全文索引,包括:
创建索引:CREATE INDEX
删除索引:DROP INDEX
Hyperbase表只支持创建全局索引(GLOBAL INDEX) 和全文索引(FULLTEXT INDEX),下面将分别介绍。
CREATE GLOBAL INDEX <index_name> ON <tableName> (
<column1> <SEGMENT LENGTH length1>|<(length1)> --[1]
[,<column2> <SEGMENT LENGTH length2>|<(length2)>,...] --[2]
);
--根据name列创建一个名为name_global的全局索引,并指定该索引字段长度为10
CREATE GLOBAL INDEX name_global ON hbase_inner_table(name(10));
CREATE FULLTEXT INDEX ON <tableName> ( --[1]
<column1> [DOCVALUES <TRUE|FALSE>] --[2]
[,<column2> [DOCVALUES <TRUE|FALSE>],...] --[3]
)SHARD NUM <n>; --[4]
--为内表hbase_inner_table根据列name、balance来创建全文索引
CREATE FULLTEXT INDEX ON hbase_inner_table(name,balance) SHARD NUM 1;
因一张表可以有多个全局索引,所以需要指定索引名:index_name
DROP INDEX [IF EXISTS] <index_name> ON <tableName>;
DROP INDEX name_global ON hbase_inner_table;
因一张表只有一个全文索引,所以只需指定表名
DROP FULLTEXT INDEX [IF EXISTS] ON <tableName>;
Hyperbase SQL中的DML(Data Manipulation Language)包括:
下面将一一介绍。
Hyperbase SQL 支持向Hyperbase表中单条插入数据或者批量插入查询结果。
单条插入数据语法一次只可插入一条记录,具体语法如下:
INSERT INTO TABLE <tableName> [(<column1>, <column2>, ...)] VALUES (<value1>, <value2>, ...);
INSERT INTO TABLE hbase_inner_table VALUES ('1','Alice','Alice123','Alice@126.com', '12341234123', 10000.0);
INSERT INTO TABLE hbase_inner_table VALUES ('2','Bob','Bob123','Bob@126.com','13571357135', 20000.0);
不同于单条插入语法一次只能插入一条记录,批量插入语法可一次性插入任意多条记录。具体语法如下:
BATCHINSERT INTO <tableName> [(<column1>, <column2>, ...)] BATCHVALUES(VALUES(<value1>, <value2>, ...), VALUES(<value1>, <value2>,...),...);
BATCHINSERT INTO hbase_inner_table BATCHVALUES (
VALUES('3','Carol','Carol123','Carol@126.com','12345234523', 30000.0),
VALUES('4','Derek','Derek123','Derek@126.com','13456345634', 40000.0));
select * from hbase_inner_table;
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
| 2 | Bob | Bob123 | Bob@126.com | 13571357135 | 20000.0 |
| 3 | Carol | Carol123 | Carol@126.com | 12345234523 | 30000.0 |
| 4 | Derek | Derek123 | Derek@126.com | 13456345634 | 40000.0 |
+-----+-------+----------+---------------+-------------+---------+
并且,从hbase_external_table中也可以查询到上述数据,因两者映射Hyperbase中的同一张表。
数据插入后可以通过UPDATE语法来更新数据
UPDATE <tableName> SET <column> = <value> WHERE <filter_conditions>;
UPDATE hbase_inner_table SET balance = 50000.0 WHERE name = 'Carol';
数据插入后可以通过DELETE语句来删除数据
DELETE FROM <tableName> WHERE <filter_conditions>;
DELETE FROM hbase_inner_table WHERE key1 = '4';
指定全局索引和全文索引进行查询,只有在 local mode 下才会生效,该模式的参数设置如下:
设置local mode
set ngmr.exec.mode = local;
该参数设置完成后才能利用索引进行有效的查询。
下面我们分别介绍对hyperbase映射表指定全局索引和全文索引进行查询的语法。而全局索引和全文索引如何创建请参考前文的介绍。
SELECT /*+USE_INDEX(<table_alias> USING <index_name>)*/... --[1]
FROM <tableName> <table_alias> --[2]
WHERE <filter_conditions>; --[3]
下面将以前文创建的全局索引name_global举例如何查询。
SELECT /*+USE_INDEX(t USING name_global)*/ * FROM hbase_inner_table t WHERE t.name = 'Alice';
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
+-----+-------+----------+---------------+-------------+---------+
若用户想对含全局索引的表做普通的查询时,需明确指定不使用任何索引
SELECT /*+USE_INDEX(<table_alias> USING NOT_USE_INDEX)*/ ... FROM <tableName> <table_alias> WHERE <filter_condition>;
SELECT /*+USE_INDEX(t USING NOT_USE_INDEx)*/ * FROM hbase_inner_table t WHERE t.name = 'Alice';
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
+-----+-------+----------+---------------+-------------+---------+
Hyperbase表的全文索引通过CONTAINS函数使用,目前支持精准匹配,前缀查询,模糊查询和范围查询四种语义,支持检索条件的逻辑组合。
SELECT ... FROM <tableName>
WHERE CONTAINS (<column>, "<fulltext_query>") --[1]
[AND|OR CONTAINS(<column>, "<fulltext_query>") AND|OR CONTAINS(<column>, "<fulltext_query>")...]; --[2]
"<operator> '<search_contents>' [and|or <operator> '<search_contents>' and|or <operator> '<search_contents>'...]"
其中,<operator> 为全文检索运算符, '<search_contents>' 为检索内容(注意单引号)。一个全文检索条件可以由多个 <operator> <search_contents> 组成,之间用 and 或 or 连接。 全文检索操作符<OPERATOR>包括:
操作符 | 支持的数据类型 | |
---|---|---|
精确匹配 | term | 所有数据类型 |
前缀查询 | prefix | STRING类型 |
正则表达式 | regexp | STRING类型 |
模糊查询 | wildcard | STRING类型 |
全文搜索 | match | STRING类型 |
in查询 | in | 所有数据类型 |
范围查询 | range | 所有数据类型 |
> | 所有数据类型 | |
< | 所有数据类型 | |
>= | 所有数据类型 | |
<= | 所有数据类型 |
下面给出几个具体事例。
select * from hbase_inner_table where contains(name, "term 'Alice'");
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
+-----+-------+----------+---------------+-------------+---------+
select * from hbase_inner_table where contains(balance, "range '[10000,30000)'");
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
| 2 | Bob | Bob123 | Bob@126.com | 13571357135 | 20000.0 |
+-----+-------+----------+---------------+-------------+---------+
Hyperdrive SQL 分为DDL、index DDL、DML和DQL四部分。 本章节将以银行信息表为例介绍Hyperdrive SQL 的建表、建索引、插入数据和数据查询等基本操作。其他详细操作请参考《Hyperbase使用手册》
建Hyperdrive我们推荐使用较简单的方法。
CREATE TABLE <tableName> (
<key> <data_type>,
<column> <data_type>,
<column> <data_type>,
...
)
STORED AS HYPERDRIVE; --[1]
Hyperdrive表支持的数据类型包括: BOOLEAN、 TINYINT、 SMALLINT、 INTEGER、 BIGINT、 DATE、 TIMESTAMP、 DECIMAL、 FLOAT、 DOUBLE、 STRING、 VARCHAR和STRUCT,有自己的编码和解码方式,解决了 NULL 等特殊类型在Hyperbase中的表示。
create table hd_inner_table(
key1 string,
name string,
password string,
email string,
cellphone string,
balance double
)STORED AS HYPERDRIVE;
建表后可通过 DESCRIBE FORMATTED 查看 hd_inner_table 的元数据信息,确认是否创建成功。如下:
describe formatted hd_inner_table;
因外表众多功能无法实现,不推荐建Hyperdrive外表。
索引相关的DDL语法包括创建和删除hyperdrive表的全局索引和全文索引:
创建索引:CREATE INDEX
删除索引:DROP INDEX
下面将具体介绍创建和删除索引的语法。
CREATE GLOBAL INDEX <index_name> ON <tableName> (
<column1> [SEGMENT LENGTH length1]|[(length1)] --[1]
[,<column2> [SEGMENT LENGTH length2]|[(length2)],...] --[2]
);
下面将以hd_inner_table表为例,创建全局索引。
CREATE GLOBAL INDEX name_balance_global_index ON hd_inner_table(name(10), balance);
-- 因列name是string类型,因此需要指定长度
CREATE FULLTEXT INDEX ON <tableName> ( --[1]
<column1> [DOCVALUES <TRUE|FALSE>] --[2]
[,<column2> [DOCVALUES <TRUE|FALSE>],...] --[3]
)SHARD NUM <n>; --[4]
CREATE FULLTEXT INDEX ON hd_inner_table(name,balance) SHARD NUM 1;
--为内表hd_inner_table根据列name、balance来创建全文索引,一个分片
建全文索引无需指定STRING类型的字段长度
因一张表可以有多个全局索引,所以需要指定索引名:index_name。
DROP INDEX [IF EXISTS] <index_name> ON <tableName>;
DROP INDEX name_balance_global_index ON hd_inner_table;
--删除创建的全局索引 name_balance_global_index
Hyperdrive SQL中的DML(Data Manipulation Language)包括:
下面将一一介绍。
Hyperdrive SQL 支持向Hyperbase表中单条插入数据或者批量插入查询结果。
单条插入数据语法一次只可插入一条记录,具体如下:
INSERT INTO TABLE <tableName> [(<column1>, <column2>, ...)] VALUES (<value1>, <value2>, ...);
INSERT INTO TABLE hd_inner_table VALUES ('1','Alice','Alice123','Alice@126.com', '12341234123', 10000.0);
INSERT INTO TABLE hd_inner_table VALUES ('2','Bob','Bob123','Bob@126.com','13571357135', 20000.0);
不同于单条插入语法一次只能插入一条记录,批量插入语法可一次性插入任意多条记录,具体如下:
BATCHINSERT INTO <tableName> [(<column1>, <column2>, ...)] BATCHVALUES(VALUES(<value1>, <value2>, ...), VALUES(<value1>, <value2>,...),...);
BATCHINSERT INTO hd_inner_table BATCHVALUES (
VALUES('3','Carol','Carol123','Carol@126.com','12345234523', 30000.0),
VALUES('4','Derek','Derek123','Derek@126.com','13456345634', 40000.0));
数据插入后可以通过UPDATE语法来更新数据,具体如下:
UPDATE <tableName> SET <column> = <value> WHERE <filter_conditions>;
UPDATE hd_inner_table SET balance = 50000.0 WHERE name = 'Carol';
数据插入后可以通过DELETE语句来删除数据,具体如下:
DELETE FROM <tableName> WHERE <filter_conditions>;
DELETE FROM hd_inner_table WHERE key1 = '4';
指定全局索引和全文索引进行查询,只有在 local mode 下才会生效,该模式的参数设置如下:
设置local mode
set ngmr.exec.mode = local;
该参数设置完成后才能利用索引进行有效的查询
SELECT /*+USE_INDEX(<table_alias> USING <index_name>)*/... --[1]
FROM <tableName> <table_alias> --[2]
WHERE <filter_conditions>; --[3]
SELECT /*+USE_INDEX(t USING name_balance_global_index)*/ * FROM hd_inner_table t WHERE t.name = 'Alice';
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
+-----+-------+----------+---------------+-------------+---------+
利用全局索引 name_balance_global_index 查询满足条件:t.name = 'Alice’的数据
使用索引查询时必须要给表起化名,并在指定索引时使用表化名。
SELECT /*+USE_INDEX(<table_alias> USING NOT_USE_INDEX)*/ ... FROM <tableName> <table_alias> WHERE <filter_condition>;
SELECT /*+USE_INDEX(t using NOT_USE_INDEX)*/ * FROM hd_inner_table t WHERE t.name = 'Alice';
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
+-----+-------+----------+---------------+-------------+---------+
明确不使用索引查询满足条件:t.name = 'Alice’的数据
SELECT /*+USE_INDEX(<table_alias> USING FULLTEXT)*/ ... FROM <table> <table_alias> WHERE <filter_conditions>;
SELECT /*+USE_INDEX(t USING FULLTEXT)*/ * FROM hd_inner_table t WHERE t.name = 'Alice';
+-----+-------+----------+---------------+-------------+---------+
| key1| name | password | email | cellphone | balance |
+-----+-------+----------+---------------+-------------+---------+
| 1 | Alice | Alice123 | Alice@126.com | 12312341234 | 10000.0 |
+-----+-------+----------+---------------+-------------+---------+
利用全文索引查询满足条件:t.name = 'Alice’的数据。
如果上述内容对您有提供帮助,欢迎多多点赞支持~😎