HBase Shell命令行操作接口实验 - Cache One

启动VirtualBox虚拟机中的HBase1.2.0,在伪分布式部署方式下进行以下实验:

进入HBase shell之前,要先在Linux Shell命令行终端执行执行start-dfs.sh 脚本启动HDFS,再执行start-hbase.sh 脚本启动HBase。

如果Linux系统已配置HBase环境变量,可直接在Linux Shell命令行终端执行hbase shell命令,即可进入HBase Shell 命令行终端环境。

[root@hbase ~]# hbase shell

                 ... ...               

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

HBase Shell; enter 'help<RETURN>' for list of supported commands.

Type "exit<RETURN>" to leave the HBase Shell

Version 1.2.0-cdh5.7.0, rUnknown, Wed Mar 23 11:46:29 PDT 2016

hbase(main):001:0>

HBase Shell终端默认不支持BackSpace键(只支持Delete键),对输入命令造成一定不便。XShell等远程终端工具提供对键盘的Delete键和BackSpace键的键序列设置。

打开菜单【文件】=》【属性】=》【终端】=》【键盘】,只需将BackSpace键序列设置为ACSII 127即可让HBase Shell终端的BackSpace键生效。

 

1)list命令

list是列出数据表命令。进入HBase shell后可以先执行list命令列出HBase当前所有数据表的表名。

用法格式:list

用法说明:列出默认名字空间default中的所有表名,命令后面不跟任何参数。

用法示例:HBase Shell终端输入list后按回车键,输出结果如下:

TABLE                                                                    

t1                                                                       

t2                                                                       

2 row(s) in 0.0140 seconds

=> ["t1", "t2"]

TABLE后面的每行字符串t1和t2都是表名,有2 row(s)说明default名字空间有两张表。list命令实际是对元数据表’hbase:meta’表进行查询。元数据表存放HBase所有数据表的元数据信息。

2)exists命令

exists是表存在判断命令,用于判断指定表名的数据表是否存在。

用法格式1:exists 't1'

用法说明:判断默认名字空间default中是否存在表名为t1的数据表

用法格式2:exists 'ns1:t1'

用法说明:判断指定名字空间 ns1中是否存在表名为t1的数据表

用法示例:HBase Shell终端输入exists 't1'后按回车键,输出结果如下:

Table t1 does exist                                                                                                      

0 row(s) in 0.0750 seconds

默认名字空间default中存在表名为't1的数据表。

3)describe命令

describe是表列族属性描述命令,描述HBase表的属性,可以缩写为desc。

用法格式1:describe 't1'或desc 't1'

用法说明:描述默认名字空间defaut中的数据表t1的列族属性

用法格式2:describe 'ns1:t1'或desc 'ns1:t1'

用法说明:描述指定名字空间 ns1中的的数据表t1的列族属性;

用法示例:HBase shell终端输入describe t1desc t1后按回车键,输出结果如下:      

Table t1 is ENABLED                                                                          
t1                                                                                                                  
COLUMN FAMILIES DESCRIPTION                                                                                          
{NAME => 'f1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}                                                                                              
{NAME => 'f2', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}                                                                                            
{NAME => 'f3', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}        
3 row(s) in 0.0970 seconds

                                           

依次显示每个列族的属性信息;第1行提示表t1已启用;第2行显示表名t1;从第3行开始在依次描述表t1的每个列族的属性信息,表t1划分为三个列族f1、f2和f3;列族的属性列表包含在花括号中,列族属性格式是”属性名=>属性值”,=>相当于等于号;由于表t1属于默认名字空间default,执行descibe 't1'命令和 descibe 'default:t1'命令的效果相同。

HBase数据表的列族是预先定义、物理上互相分离的,常见的列族属性说明如下:

NAME:列族名称,

BLOOMFILTER:布隆过滤器,

VERSIONS:列值的最大版本数量,

MIN_VERSIONS:列值保留的最小版本数量,

DATA_BLOCK_ENCODING:是否数据块编码,

IN_MEMORY:数据是否优先存于内存中,

BLOCKCACHE:是否开启数据块缓存,

BLOCKSIZE:设置HBASE默认块大小,

TTL:列版本数据的生存时间,

COMPRESSION:数据压缩方式,

REPLICATION_SCOPE:跨集群复制的范围,

KEEP_DELETED_CELLS:是否保留删除的单元格。

为了提升HBase的性能,需要根据应用场景对HBase进行性能优化,而HBase列族的很多属性都是用于对HBase的性能优化。

4)create命令

create是创建表命令,用于创建一张新的数据表。在HBase Shell终端只输入create后按回车,会提示create命令的各种用法。create命令用法比较复杂,可先掌握其简单常见用法。

用法格式1:create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}

用法说明:在默认名字空间default创建表名t1的包含3个列族f1,f2和f3的数据表;这是标准用法,简化用法格式是create 't1', 'f1', 'f2', 'f3'

用法格式2:create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}

用法说明:在指定名字空间 ns1中创建表名为t1的数据表,包含1个名字为f1的列族,并指定单元格值的最大版本数为5

用法示例1:HBase shell终端输入create students , info后按回车键,输出结果如下:

0 row(s) in 1.4260 seconds

=> Hbase::Table - students

第1行提示创建表命令的执行时长;第2行提示创建完成的数据表的表名。students表用于保存学生的基本信息和成绩信息。info列族用于保存学生姓名、年龄、性别等基本信息。

执行create命令创建表时,必须指定至少一个列族;只指定表名而无列族名,终端会提示用法错误。create命令执行完成后可执行list命令查看新建的表students;还可执行desc students命令查看新创建表students的列族属性,只有一个列族info。

执行list命令输出结果如下:

TABLE                                                                                 

students                                                                               

t1                                                                                    

t2                                                                                    

3 row(s) in 0.0250 seconds

=> ["students", "t1", "t2"]

执行desc students命令输出结果如下:

Table students is ENABLED                                                                

students                                                                                 COLUMN FAMILIES DESCRIPTION                                                                 

{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}     

1 row(s) in 0.0540 seconds

list命令可以查看新建的students表是否存在,desc命令可以查看info列族属性信息。

用法示例2:HBase shell终端依次执行命令create_namespace 'ns1'create ns1:t1, info,输出结果如下:

hbase(main):026:0> create_namespace 'ns1'

0 row(s) in 0.0530 seconds

hbase(main):027:0> create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}

0 row(s) in 1.2900 seconds

=> Hbase::Table - ns1:t1

创建名字空间ns1,在名字空间ns1中创建数据表t1,包含一个列族f1,最大版本数5。

hbase(main):028:0> list

TABLE                                           

ns1:t1                                           

students                                         

t1                                              

t2                                              

4 row(s) in 0.0210 seconds

=> ["ns1:t1", "students", "t1", "t2"]

hbase(main):029:0> desc 'ns1:t1'

Table ns1:t1 is ENABLED                           

ns1:t1                                         

COLUMN FAMILIES DESCRIPTION                    

{NAME => 'f1', BLOOMFILTER => 'ROW', VERSIONS => '5', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}

1 row(s) in 0.0470 seconds

list命令查看新建的数据表ns1:t1,desc命令查看表属性,列族f1中VERSION=5。

5)alter命令

alter是修改表命令,能够指定列族级别、数据表级别和集群级别的修改操作。在HBase Shell终端只输入alter后按回车,会提示alter命令的各种用法。该命令功能强大,用法复杂,可先掌握其简单常见用法。alter命令的一般格式是alter t1, ATTRNAME=>ATTRVALUE

(1)列族级别

列族级别的修改操作主要是增加列族、删除列族和修改列族属性。

用法格式1:alter t1, NAME=>f2

用法说明:修改数据表t1,增加一个新列族f2

用法示例:HBase shell终端输入alter students, score后按回车键,输出结果如下:

Updating all regions with the new schema...

1/1 regions updated.

Done.

0 row(s) in 2.2810 seconds

为students表增加一个列族score,等效命令是alter ‘students1’, NAME=>‘score’;第1行提示更新所有的regions为新的表模式;增加、删除列族及修改列族属性都会导致表结构的更新,学习HBase体系架构得知由HMaser负责表结构的更新;alter命令执行后可再执行desc ‘students’命令查看对列族属性的修改,会发现多了一个score列族的属性描述。

如果要增加的列族不存在,alter命令作用是增加一个新的列族;如果要增加列族已经存在,alter命令作用可以是修改指定列族的属性或删除指定列族;

用法格式2:alter 't1', NAME => 'f1', VERSIONS => 5

用法说明:修改数据表t1,将其列族f1的列族属性最大版本数VERSIONS 修改为5

用法示例:HBase shell终端输入alter 'students', NAME => 'score', VERSIONS => 5后按回车键,输出结果如下:

Updating all regions with the new schema...

1/1 regions updated.

Done.

0 row(s) in 2.0120 seconds

修改数据表students,将其列族score的列族属性最大版本数VERSIONS修改为5。执行desc ‘students’命令查看表列族属性,发现score列族的列族属性VERSIONS => '5'。

用法格式3:alter 't1', NAME => 'f1', METHOD => 'delete'alter 't1', 'delete' => 'f1'

用法说明:修改数据表t1,对其列族名为f1的列族执行删除操作。

用法示例:HBase shell终端输入alter 'students', NAME => 'score', METHOD => 'delete'后按回车键,输出结果如下:

Updating all regions with the new schema...

1/1 regions updated.

Done.

0 row(s) in 2.2570 seconds

alter命令执行后可再执行desc ‘students’命令查看对列族属性的修改,会发现score列族已经不存在。

用法格式4:alter t1, NAME=>f1, ATTRNAME=>ATTRVALUE

用法说明:修改数据表t1,修改列族f1的属性名为ATTRNAME的属性值为ATTRVALUE。

用法示例:HBase shell终端输入alter 'students', NAME=>'score', COMPRESSION=>'GZ'后按回车键,输出结果如下:

Updating all regions with the new schema...

1/1 regions updated.

Done.

0 row(s) in 2.0000 seconds

修改数据表students的指定列族score的列族属性压缩模式COMPRESSION为GZ。为节省存储空间,HBase将数据保存到HDFS时可按压缩模式进行数据压缩,常用压缩模式有GZ和SNAPPY等。修改完成后可以执行desc ‘students’命令查看对列族属性COMPRESSION的修改。理论上desc命令能查看到的列族属性都可以用alter命令来修改其对应的属性值。

(2)数据表级别

数据表级别的修改操作主要是修改数据表级别的属性,这些属性属于整张表。

用法格式:alter t1, ATTRNAME1=>ATTRVALUE1, ATTRNAME2=>ATTRVALUE2, ....

用法说明:修改表t1的表级别属性ATTRNAME1、ATTRNAME2...

数据表级别操作允许的属性名必须是属于表级别的属性:

MAX_FILESIZE

READONLY

MEMSTORE_FLUSHSIZE

DEFERRED_LOG_FLUSH

DURABILITY

REGION_REPLICATION

NORMALIZATION_ENABLED

PRIORITY

IS_ROOT

IS_META

用法示例:HBase shell终端输入alter 'students', MAX_FILESIZE=>134217728后按回车键,输出结果如下:

Updating all regions with the new schema...

1/1 regions updated.

Done.

0 row(s) in 2.3060 seconds

修改数据表students的文件大小最大值MAX_FILESIZE为134217728字节。

修改完成后可执行desc ‘students’命令,查看对列族属性FILESIZE的修改结果如下:

students, {TABLE_ATTRIBUTES => {MAX_FILESIZE => '134217728'}   

(3)集群级别

集群级别的修改操作主要是修改HBase集群的配置参数。HBase的数据表或列族属性可以通过在HBase集群配置文件中修改相应配置参数进行修改。例如在配置文件hbase- site.xml中设置配置参数hbase.hstore.blockingStoreFiles,参数含义是当某个region的storefile文件个数达到该值则阻塞数据写入操作。若指定列族名,该配置属性针对数据表的指定列族有效。

用法格式1:alter 't1', { CONFIGURATION=> {ATTRNAME => ATTRVALUE}}

用法说明:修改表t1的集群级别配置参数ATTRNAME,修改对整个数据表t1均有效。

用法示例:HBase shell终端输入

alter 'students', {CONFIGURATION=> { 'hbase.hstore.blockingStoreFile' => '15' }}后按回车键,输出结果如下:

Updating all regions with the new schema..

1/1 regions updated.

Done.

0 row(s) in 2.2780 seconds

修改完成后可执行desc students’命令,查看对集群配置参数的修改结果如下:

students,{TABLE_ATTRIBUTES=>{MAX_FILESIZE=>'134217728',CONFIGURATION=>{'hbase.hstore.blockingStoreFile' => '15'}

将数据表students的配置参数hbase.hstore.blockingStoreFile修改为15。

用法格式2:alter 't1', { NAME => 'f1', CONFIGURATION=> {ATTRNAME => ATTRVALUE}}

用法说明:修改表t1的集群级别配置参数ATTRNAME,修改只对表t1的列族f1有效。

用法示例:HBase shell终端输入alter 'students', {NAME => 'info',CONFIGURATION=> { 'hbase.hstore.blockingStoreFile' => '15' }}后按回车键,输出结果如下:

Updating all regions with the new schema..

1/1 regions updated.

Done.

0 row(s) in 2.0250 seconds

修改完成后可执行desc ‘students’命令,查看对列族info的集群配置参数修改结果如下:

{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0', CONFIGURATION => {'hbase.hstore.blockingStoreFile' => '15'}}

将students数据表的info列族的hbase.hstore.blockingStoreFiles属性值修改为15,而不会影响整个数据表或数据表的其他列族。

6)disable命令

disable是禁用表命令,用于禁用指定表名的数据表。

用法格式1:disable 't1'

用法说明:禁用默认名字空间default表名为t1的数据表

用法格式2:disable 'ns1:t1'

用法说明:禁用指定名字空间ns1中表名为t1的数据表

用法示例:禁用默认名字空间的数据表t1

HBase Shell终端执行disable 't1'命令,输出结果如下:

0 row(s) in 2.4390 seconds

0 row(s) 表示命令执行成功。

HBase Shell终端执行is_disabled 't1'命令,输出结果如下:

true       

0 row(s) in 0.0480 seconds

is_disabled命令是判断数据表是否已被禁用,true表示已禁用。

7)enable命令

enable是启用表命令,用于启用用指定表名的数据表。

用法格式1:enable 't1'

用法说明:启用默认名字空间default表名为t1的数据表

用法格式2:enable 'ns1:t1'

用法说明:启用指定名字空间ns1中表名为t1的数据表

用法示例:启用默认名字空间的数据表t1

HBase Shell终端执行enable 't1'命令,输出结果如下:

0 row(s) in 1.3180 seconds

0 row(s) 表示命令执行成功。

HBase Shell终端执行is_enabled 't1'命令,输出结果如下:

true  

0 row(s) in 0.0680 seconds

is_enabled命令是判断数据表是否已启用,true表示已启用。

8)drop命令

drop是删除表命令,用于删除指定表名的数据表,只能删除已禁用的数据表。如果数据表中有数据,该表也会被删除,表中数据会丢失。

用法格式1:drop 't1'

用法说明:删除默认名字空间default表名为t1的数据表

用法格式2:drop 'ns1:t1'

用法说明:删除指定名字空间ns1中表名为t1的数据表

用法示例:删除默认名字空间的数据表t1

HBase Shell终端执行drop 't1'命令,部分输出结果如下:

ERROR: Table t1 is enabled. Disable it first.

Here is some help for this command:

Drop the named table. Table must first be disabled

删除指定名称的数据表时,该表必须首先被禁用。

HBase Shell终端先执行disable 't1'命令,再执行drop 't1'命令,部分输出结果如下:

0 row(s) in 1.3170 seconds

0 row(s) 表示命令执行成功。

最后执行list命令,确认t1表已经被删除。

9)put命令

     put是写数据操作命令,对应增删改查中的增加和修改,类似于SQL中的insert和update语句。put命令实际上是针对指定数据列插入一个新的时间戳版本的单元格值。在HBase Shell终端只输入put后按回车,会提示put命令的完整用法。

用法格式1:put 't1', 'r1', 'c1', 'value'

用法说明:指定数据表t1、行键r1和列名c1,写入一个值为value的数据列单元格,其中t1是表名,r1是行键,c1是列名;列名由列族名列修饰符组成,用冒号间隔;c1格式为f1:q1,f1是列族名,q1是列修饰符;value是单元格值,单元格值是无类型的字节数组。

用法示例1:增加一个姓名为Jack的学生。

在HBase Shell终端执行命令put 'students', 's001', 'info:name', 'Jack',输出结果如下:

0 row(s) in 0.0217 seconds

向students表中写入一个新的数据列单元格,指定该单元所属行的行键为s001,所属列族的名称为info,列修饰符为name,要保存的单元格值为Jack;未指定时间戳版本,默认值为写入时的当前系统时间。

注意0 row(s)意思不是写入了0行,而是代表数据写入成功。HBase Shell命令行使用JRuby语法,执行put命令实际会调用相应JRuby脚本。程序执行成功则给调用者返回0,否则返回代表不同类型错误的其他值,这也符合软件开发惯例。put命令写数据执行完成后,可以再执行读数据命令get 'students', 's001查看刚写入的数据列单元格,输出结果如下:

COLUMN        CELL

info:name       timestamp=1616730232823, value=Jack

1 row(s) in 0.0270 seconds

COMUMN列名包含列族名称info和列修饰符name,列族名称是固定的,列修饰符是动态设定的,CELL单元格包含时间戳timestamp、单元格值value。

用法示例2:修改学生Jack的姓名为Jackey。

在HBase Shell终端执行写数据命令put 'students', 's001', 'info:name', 'Jackey',再执行读数据命令get students, 001查看刚写入的数据列单元格,输出结果如下:

COLUMN        CELL

info:name       timestamp=1616730770128, value=Jackey

1 row(s) in 0.0270 seconds

表students的s001行的info:name列的单元格值变成Jackey,时间戳timestamp值也有所增加。如果指定行键不存在或行键存在但列名不存在,put命令是增加一个新列;如果指定行键和列名的数据列已存在,put命令是修改原有数据列单元格的值;put命令增加或修改一个数据列,实质上都是对这个数据列插入一个新的时间戳版本的单元格。

用法示例3:执行命令put students, s001, info:, none,再执行命令get 'students', 's001',输出结果如下:

COLUMN                          CELL                                                                                     

 info:                          timestamp=1616731500154, value=none                                                      

 info:name                      timestamp=1616730770128, value=Jackey                                                    

2 row(s) in 0.0350 seconds

put命令中省略列修饰符也能成功写入一列数据,HBase允许列名中的列修饰符为空。

用法示例4:给学生Jack增加一个语文成绩90。

执行命令put 'students', 's001', 'score:Chinese', '90',再执行读数据命令get 'students', 's001'查看刚写入的数据列,输出结果如下:

COLUMN                        CELL                                      

 info:                          timestamp=1616731500154, value=none           

 info:name                     timestamp=1616730770128, value=Jackey         

 score:Chinese                  timestamp=1616732199048, value=90            

3 row(s) in 0.0290 seconds

 

向students表中写入一个新的数据列单元格,指定该单元所属行的行键为s001,所属列族名为score,列修饰符为Chinese,要保存的单元格值为90。不同列族的列的行键相同,才能从逻辑上关联起来。学生基本信息info列族和成绩信息score列族中的行键相同,才能将学生的基本信息和学生的成绩信息建立关联。

10)get命令

    get是读数据操作命令,对应增删改查中的查看,类似SQL中的select语句。get操作是对指定行键的特定数据行的精准查询,而后面要学的scan操作是全表扫描或对指定范围的若干数据行的多行扫描。在HBase Shell终端只输入命令名get,会提示get命令的完整用法。get命令的用法较复杂,可先掌握其常见用法,并学会利用HBase Shell帮助中提示的get命令用法格式,构造出所需执行的get命令。

用法格式1:get t1, r1  

用法说明:最简单用法,t1是表名, r1是行键,读取行键为r1的所有数据列的单元格值

用法示例:读取行键为s001所有的数据列单元格

在HBase Shell终端输入命令get students, s001并按回车键,输出结果如下:

COLUMN                        CELL                                      

 info:                          timestamp=1616731500154, value=none           

 info:name                     timestamp=1616730770128, value=Jackey         

 score:Chinese                  timestamp=1616732199048, value=90             

3 row(s) in 0.0290 seconds

get命令执行一次只会查找指定行键的某一数据行,不会执行一次查找多行数据。get命令会读取每个列族,会读取某一数据行的每个列族的所有数据列。注意get命令执行结果中,3 row(s)意思不是读取了3行,而是读取了3个数据列单元格。

用法格式2:get t1, r1, c1 

用法说明:读取指定行键r1和数据列c1的单元格值。其中t1是表名, r1是行键,c1是数据列名;c1格式为f1:q1,f1是列族名,q1是列修饰符;

用法示例1:读取行键为s001,数据列为info:name的单元格值

在HBase Shell终端输入命令get 'students', 's001', 'info:name'并按回车键,输出结果如下:

COLUMN         CELL                                    

info:name       timestamp=1616730770128, value=Jackey

1 row(s) in 0.0230 seconds

查找行键为s001的学生姓名,查到学生姓名为Jackey,时间戳值1616730770128换算成日期时间是2021-03-26 11:52:50。

用法示例2:读取行键为s001,数据列为score:Chinese的单元格值

在HBase Shell终端输入命令get 'students', 's001', 'score:Chinese'并按回车键,输出结果如下:

COLUMN              CELL                          

 score:Chinese         timestamp=1616732199048, value=90

查找行键为s001的学生的语文成绩,查到语文成绩为99,时间戳值1616732199048换算成日期时间是2021-03-26 12:16:39。

用法格式3:get 't1', 'r1', {COLUMN => 'c1', VERSIONS => n}

用法说明:读取指定行键r1、数据列f1:q1和版本数n的单元格值。其中t1是表名, r1是行键,COLUMN =>'c1'是指定数据列名为f1:q1,f1是列族名q1是列修饰符,VERSIONS => n表示读到的单元格值的版本数为n个。

用法示例:查找学生Jackey的多次数学成绩。

(1)先写入学生Jackey多次数学成绩

执行写数据命令put 'students', 's001', 'score:Maths', 58写入第1次数学成绩58

执行写数据命令put 'students', 's001', 'score:Maths', 66写入第2次数学成绩66

执行写数据命令put 'students', 's001', 'score:Maths', 80写入第3次数学成绩80

(2)再读取学生Jackey最新1次的数学成绩

在HBase Shell终端执行读数据命令get students, 001, score:Maths ,输出结果如下:

COLUMN             CELL                           

score:Maths          timestamp=1616733423421, value=80

get命令默认只读出最新写入的单元格值,即时间戳版本最大的单元格值。

(3)读取学生Jackey的3次数学成绩

在HBase Shell终端执行读数据命令

get 'students', 's001', {COLUMN => 'score:Maths', VERSIONS => 3}, 输出结果如下:

COLUMN                  CELL                                  

score:Maths               timestamp=1616733423421, value=80      

score:Maths               timestamp=1616733419887, value=66      

score:Maths               timestamp=1616733410248, value=58                                                        

3 row(s) in 0.0270 seconds

同一个数据列单元格的不同版本单元格值,按照时间戳从大到小的顺序排列,先显示最新的单元格值;VERSIONS指定要读取的数据列单元格值的版本数,不得超过列族属性中设定的最大版本数量。

(4)读取学生Jackey的更多次数的数学成绩

在HBase Shell终端依次执行以下命令:

执行写数据命令put 'students', 's001', 'score:Maths', 85写入第4次数学成绩85,

执行写数据命令put 'students', 's001', 'score:Maths', 90写入第5次数学成绩90,

执行写数据命令put 'students', 's001', 'score:Maths', 100 写入第6次数学成绩100,

执行读数据命令get 'students', 's001', {COLUMN => 'score:Maths', VERSIONS => 6},终端输出结果如下:

COLUMN                          CELL                          

 score:Maths                    timestamp=1616734285113, value=100

 score:Maths                    timestamp=1616734282071, value=90

 score:Maths                    timestamp=1616734276071, value=85

 score:Maths                    timestamp=1616733423421, value=80

 score:Maths                    timestamp=1616733419887, value=66

由于列族info的属性设定的最大版本数量VERSION=5,而执行put写入命令6次,超过最大版本数量5,会导致最早写入的1个单元格值被删除。因此最多能读取到最大版本数的5个数据列单元格值。

用法格式4:get t1, r1, COLUMN =>'c1', TIMESTAMP=> ts

用法说明:读取指定行键r1、数据列c1和时间戳ts的单元格值。其中t1是表名, r1是行键,COLUMN =>'c1'是指定数据列名为c1(c1格式为f1:q1,f1是列族名,q1是列修饰符), TIMESTAMP=> ts是指定时间戳版本值为ts。

用法示例:读取学生Jack的指定时间戳版本的数学成绩。

在HBase Shell终端执行命令

get 'students', 's001', COLUMN => 'score:Maths', TIMESTAMP=>1616733423421

输出结果如下:

COLUMN                       CELL                          

score:Maths                    timestamp=1616733423421, value=80

get 'students', 's001', COLUMN =>'score:Maths', TIMESTAMP=> 16127071428403

根据TIMESTAMP能够精确查出数据列单元格指定时间戳的版本值,时间戳值必须精确到毫秒。

11)scan命令

    scan是全表数据扫描操作命令,对应增删改查中的多行查询,类似SQL中的select 全表查询。scan命令是对指定行键范围的多行数据进行扫描,如不指定行键范围则会执全表扫描。在HBase Shell终端只输入命令名scan,会提示scan命令的完整用法。scan命令的用法较复杂,先能掌握常用用法,学会利用HBase Shell帮助中提示的scan命令用法格式构造出所需执行的scan命令。

用法格式1:scan t1  

用法说明:对表t1进行全表数据扫描,最简单用法,t1是表名

用法示例:对student表进行全表数据扫描

在HBase Shell终端执行命令scan 'students',输出结果如下:

ROW      COLUMN+CELL  

 s001     column=info:, timestamp=1616731500154, value=none        

 s001     column=info:name, timestamp=1616730770128, value=Jackey

 s001     column=score:Chinese, timestamp=1616732199048, value=90  

 s001     column=score:Maths, timestamp=1616734285113, value=100

1 row(s) in 0.0215 seconds

对指定表student进行全表数据扫描,会读取所有行的每个列族的所有数据列的最新时间戳版本的单元格值。1 row(s)表示扫描的行数。scan命令输出结果信息中会提示影响的行数,这与关系数据库执行select语句类似。

用法格式2:scan t1 , { STARTROW => 'rowkey'}

scan t1 , { STARTROW => 'rowkey', STOPROW =>'rowkey'}

用法说明:对表t1的指定行键范围的数据进行扫描,其中t1是表名,STARTROW 和STOPROW 指定行键的起止范围,若只指定开始行键STARTROW则会扫描到数据表最后一行。

为了更好的示例效果,向students表再写入多行数据,在HBase Shell终端依次执行以下put命令:

执行命令put 'students', 's002', 'info:name', 'Tom'

执行命令put 'students', 's002', 'info:age', 20

执行命令put 'students', 's002', 'score:Chinese', 85

执行命令put 'students', 's002', 'score:Maths', 90

执行命令put 'students', 's003', 'info:name', 'Mike'

执行命令put 'students', 's003', 'info:age', '19'

执行命令put 'students', 's003', 'score:Chinese', 90

执行命令put 'students', 's003', 'score:Maths', 95

执行命令put 'students', 's004', 'info:name', 'Lucy'

执行命令put 'students', 's005', 'info:name', 'Lily'

用法示例:对student表的指定行键范围的数据进行扫描

在HBase Shell终端执行命令scan 'students', { STARTROW => 's002'},输出结果如下:

ROW COLUMN+CELL                                         

 s002 column=info:age, timestamp=1616820531841, value=20    

 s002 column=info:name, timestamp=1616820504321, value=Tom

 s002 column=score:Chinese, timestamp=1616820541694, value=85  

 s002 column=score:Maths, timestamp=1616820558104, value=90   

 s003 column=info:age, timestamp=1616820574187, value=19

 s003 column=info:name, timestamp=1616820565300, value=Mike  

 s003 column=score:Chinese, timestamp=1616820584633, value=90

 s003 column=score:Maths, timestamp=1616820593768, value=95   

 s004 column=info:name, timestamp=1616820613436, value=Lucy   

 s005 column=info:name, timestamp=1616820621613, value=Lily

4 row(s) in 0.0440 seconds

只指定开始行键STARTROW,扫描范围是从STARTROW到数据表最后一行,包括STARTROW行和最后一行。

在HBase Shell终端执行命令scan 'students', { STARTROW => 's002', STOPROW =>'s004'},输出结果如下:

ROW COLUMN+CELL                                      

 s002 column=info:age, timestamp=1616820531841, value=20    

 s002 column=info:name, timestamp=1616820504321, value=Tom

 s002 column=score:Chinese, timestamp=1616820541694, value=85  

 s002 column=score:Maths, timestamp=1616820558104, value=90   

 s003 column=info:age, timestamp=1616820574187, value=19

 s003 column=info:name, timestamp=1616820565300, value=Mike  

 s003 column=score:Chinese, timestamp=1616820584633, value=90

 s003    column=score:Maths, timestamp=1616820593768, value=95

2 row(s) in 0.0410 seconds

由于STARTROW和STOPROW是左闭右开区间,同时指定开始行键STARTROW和终止行键STOPROW,扫描结果的行键范围包括STARTROW但不包括STOPROW,因此扫描结果是从students表的s002行到s003行,不包括s004行。

用法格式3:scan 't1', {COLUMNS => ['f1']}

scan 't1', {COLUMNS => ['f1:q1']}

用法说明:{COLUMNS => ['f1']} 是对表t1的指定列族进行扫描,COLUMNS => ['f1:q1']}是对表t1的指定列f1:q1进行扫描;其中t1是表名,f1是列族名,q1是列修饰符,f1:q1是指定列,COLUMNS是列名

用法示例1:对student表的指定列族进行扫描

在HBase Shell终端执行命令scan 'students', {COLUMNS => ['info']},输出结果如下:

ROW COLUMN+CELL                                         

 s001     column=info:, timestamp=1616731500154, value=none        

 s001     column=info:name, timestamp=1616730770128, value=Jackey

 s002 column=info:age, timestamp=1616820531841, value=20    

 s002 column=info:name, timestamp=1616820504321, value=Tom  

 s003 column=info:age, timestamp=1616820574187, value=19

 s003 column=info:name, timestamp=1616820565300, value=Mike  

 s004 column=info:name, timestamp=1616820613436, value=Lucy   

 s005 column=info:name, timestamp=1616820621613, value=Lily

5 row(s) in 0.0490 seconds

扫描students表的指定列族info的所有数据列的最新时间戳版本的单元格

用法示例2:对student表的指定数据列进行扫描

在HBase Shell终端执行命令scan 'students', {COLUMNS => ['info:name']},输出结果如下:

ROW COLUMN+CELL                                         

 s001     column=info:name, timestamp=1616730770128, value=Jackey

 s002 column=info:name, timestamp=1616820504321, value=Tom  

 s003 column=info:name, timestamp=1616820565300, value=Mike  

 s004 column=info:name, timestamp=1616820613436, value=Lucy   

 s005 column=info:name, timestamp=1616820621613, value=Lily

5 row(s) in 0.5410 seconds

扫描students表的指定数据列info:name的所有最新时间戳版本的单元格

用法格式4:scan 't1', {LIMIT => n} 

用法说明:对表t1的前n行数据进行扫描,t1是表名,LIMIT是限定扫描前n行数据

用法示例:在HBase Shell终端执行命令scan 'students', {LIMIT => 3},输出结果如下:

ROW COLUMN+CELL                                      

 s001     column=info:, timestamp=1616731500154, value=none        

 s001     column=info:name, timestamp=1616730770128, value=Jackey

 s001     column=score:Chinese, timestamp=1616732199048, value=90  

 s001     column=score:Maths, timestamp=1616734285113, value=100

 s002 column=info:age, timestamp=1616820531841, value=20    

 s002 column=info:name, timestamp=1616820504321, value=Tom

 s002 column=score:Chinese, timestamp=1616820541694, value=85  

 s002 column=score:Maths, timestamp=1616820558104, value=90   

 s003 column=info:age, timestamp=1616820574187, value=19

 s003 column=info:name, timestamp=1616820565300, value=Mike  

 s003 column=score:Chinese, timestamp=1616820584633, value=90

 s003    column=score:Maths, timestamp=1616820593768, value=95

3 row(s) in 0.1040 seconds

说明:扫描students表的前3行的所有数据列的最新时间戳版本的单元格

用法格式5:scan 't1', { TIMERANGE => [ts1, ts2}}

用法说明:对表t1的时间戳值在ts1, ts2之间的数据列单元格进行扫描,其中t1是表名, TIMERANGE => [ts1, ts2]是指定时间戳范围,是左闭又开区间,包括ts1且不包括ts2。 

用法示例:在HBase Shell终端执行命令scan 'students', { TIMERANGE => [1616734285113, 1616820584633] },输出结果如下:

ROW COLUMN+CELL                                     

 s001    column=score:Maths, timestamp=1616734285113, value=100

 s002 column=info:age, timestamp=1616820531841, value=20    

 s002 column=info:name, timestamp=1616820504321, value=Tom

 s002 column=score:Chinese, timestamp=1616820541694, value=85  

 s002 column=score:Maths, timestamp=1616820558104, value=90   

 s003 column=info:age, timestamp=1616820574187, value=19

 s003    column=info:name, timestamp=1616820565300, value=Mike

3 row(s) in 0.0960 seconds

TIMERANGE的时间戳范围ts1, ts2是左闭右开区间,扫描结果时间戳包括ts1但不包括ts2,因此扫描结果中包括时间戳为1616734285113的数据列单元格,但不包括时间戳为1616820584633的数据列单元格。

用法格式6:scan 't1', RAW => true

scan 't1', { RAW => true, VERSIONS => n}

scan 't1', { RAW => true, COLUMN=> f1}

用法说明:扫描显示原始的单元格,包括有删除标记DELETE的单元格,RAW=> true是扫描原始单元格,VERSIONS => n是扫描的原始单元格版本数量,COLUMN=> ‘f1’是扫描指定列族f1。

用法举例:扫描显示数据表students的原始单元格

先在HBase Shell终端执行命令delete 'students', 's001', 'info:'删除一个列修饰符为空的数据列,再执行命令scan 'students', { RAW => true, VERSIONS => 5, COLUMNS =>'info'},输出结果如下:

ROW       COLUMN+CELL                                         

 s001     column=info:, timestamp=1616823366035, type=DeleteColumn  

 s001     column=info:, timestamp=1616731500154, value=none          

 s001     column=info:name, timestamp=1616730770128, value=Jackey    

 s002     column=info:age, timestamp=1616820531841, value=20        

 s002     column=info:name, timestamp=1616820504321, value=Tom     

 s003     column=info:age, timestamp=1616820574187, value=19        

 s003     column=info:name, timestamp=1616820565300, value=Mike     

 s004     column=info:name, timestamp=1616820613436, value=Lucy      

 s005     column=info:name, timestamp=1616820621613, value=Lily

5 row(s) in 0.0400 seconds

students表s001行中单元格值为none的数据列info:已标记为删除,type=DeleteColumn是删除标记。

HBase被删除的数据列单元格并不会被立即删除,而是先设置一个删除标记DELETE,等待下次大缩并major compaction时再真正从磁盘的HFiles文件中清除。原始单元格扫描是将包括已标记删除但未被删除的原始单元格都扫描出来。

通过指定RAW参数来显示原始单元格,可以配合 VERSIONS参数或COLUMNS参数一起使用。如果RAW参数配合COLUMNS参数一起使用,COLUMNS参数中只能指定列族名而不能指定列名。如果尝试执行命令scan 'students', { RAW => true, VERSIONS => 5, COLUMNS =>'info:name'},输出结果会提示以下报错信息:

ERROR: org.apache.hadoop.hbase.DoNotRetryIOException: Cannot specify any column for a raw scan

意思是原始扫描不能指定任何列。

12)count命令

count命令会统计指定数据表的数据行数。如果数据表的行数非常多,执行该命令会花费较长时间,原因是该命令需要运行一个mapreduce作业任务来执行行数统计。

用法格式:count 't1'

用法说明:统计表t1的数据行数。

用法举例:在HBase Shell终端执行命令count 'students',输出结果如下:

5 row(s) in 0.0120 seconds

=> 5

说明当前students表中总共有5行数据。

13)delete命令

  delete是删除指定的数据列单元格的操作命令,对应增删改查中的删除,类似SQL中的delete语句。在HBase Shell终端只输入命令名delete,会提示delete命令的完整用法。scan命令的用法比较简单。

用法格式1:delete 't1', 'r1', 'c1'

用法说明:删除表t1中行键为r1、列名为c1的数据列单元格。其中t1是表名,r1是行键,c1是列名;c1格式为f1:q1,f1是列族名,q1是列描述符。

用法示例:删除数据表students的指定数据列单元格

在HBase Shell终端执行命令delete 'students', '001', 'score:Chinese',输出结果如下:

0 row(s) in 0.0720 seconds

执行scan 'students'命令确认删除成功。删除students表的行键为001,列名为scores:Chinese的数据列单元格。0 row(s)中的数字0表示删除命令执行成功。delete命令无论是否真正删除数据都会返回0 row(s)。

用法格式2:delete 't1', 'r1', 'c1', ts

用法说明:删除表t1中行键为r1、列名为c1、时间戳为ts的数据列单元格,其中t1是表名,r1是行键,c1是列名,ts是时间戳值

用法示例:删除数据表students的指定数据列单元格

在HBase Shell终端执行命令delete 'students', 's001', 'score:Maths', 1616734285113,输出结果如下:

0 row(s) in 0.0340 seconds

执行scan 'students'命令确认删除成功。删除students表的行键为001,列名为scores:Maths,时间戳为1616734285113的数据列单元格。delete命令指定的时间戳值小于要删除的数据列单元格的时间戳将不会执行删除,等于或大于要删除的数据列单元格的时间戳将会执行删除。

delete命令只能对一行数据进行删除,只能删除一行数据中的指定数据列单元格。delete命令可以指定行键、列族和列描述符或指定行键、列族、列描述符和时间戳值。

delete命令必须指定行键,但不能只指定行键来删除某一行的所有数据列单元格,也不能不指定行键只指定列族来删除某列族的所有数据列单元格。

如果指定行键、列族和列描述符或指定行键、列族、列描述符和时间戳值的数据列单元格不存在,delete命令将不会执行任何删除操作,也不会给出任何删除不成功的提示。

14)deleteall命令

deleteall命令是删除指定数据行的操作命令。deleteall命令如果只指定行键,则属于该数据行的每个列族的所有数据列单元格都会被删除。生产环境执行deleteall命令需谨慎。

用法格式1:deleteall 't1', 'r1'

用法说明:删除数据表t1的行键为r1的数据行,其中t1是表名,r1是行键

用法示例:删除指定行的所有数据列的单元格

在HBase Shell终端执行命令deleteall ‘students’, 's001'输出结果如下:

0 row(s) in 0.0240 seconds

执行scan 'students'命令确认删除成功。删除students表的行键s001的所有数据列单元格,0 row(s)中的数字0表示删除命令执行成功。

用法格式2:deleteall 't1', 'r1', 'c1'

用法说明:删除数据表t1的行键为r1,列名为c1的数据列单元格,其中t1是表名,r1是行键,c1是列名

用法示例:删除指定行的指定数据列的单元格

在HBase Shell终端执行命令deleteall 'students', 's001', 'info:name'输出结果如下:

0 row(s) in 0.0213 seconds

执行scan 'students'命令确认删除成功。删除students表的行键s001,列名info:name的所有数据列单元格,0 row(s)中的数字0表示删除命令执行成功。

用法格式3:deleteall 't1', 'r1', 'c1', ts

用法说明:删除表t1中行键为r1、列名为c1、时间戳为ts的数据列单元格,其中t1是表名,r1是行键,c1是列名,ts是时间戳值

用法示例:删除数据表students的指定数据列单元格

在HBase Shell终端执行命令deleteall 'students', 's002', 'info:age', 1616851507964,输出结果如下:

0 row(s) in 0.0140 seconds

执行scan 'students'命令确认删除成功。删除students表的行键s002,列名info:age,时间戳值1616851507964所有数据列单元格,0 row(s)中的数字0表示删除命令执行成功。

15)append命令

append是给指定的数据列单元格的单元格值追加内容的操作命令。在HBase Shell终端输入append后HBase Shell会提示该命令的完整用法。

用法格式:append 't1', 'r1', 'c1', 'value'

用法说明:给数据表t1的行键为r1,列名为c1的数据列单元格追加内容value

用法举例:在HBase Shell终端执行命令append 'students', 's002', 'info:name', 'son',输出结果如下:

0 row(s) in 0.0153 seconds

给students表的行键s002,列名info:name的数据列单元格追加内容son。执行get 'students','s002', 'info:name'命令确认追加成功,输出结果如下:

COLUMN                 CELL  

 info:name                timestamp=1616853133371, value=Tomson  

1 row(s) in 0.4540 seconds

行键s002,列名info:name的数据列单元格值Tom后面追加了son后变成了Tomson。

16)truncate命令

truncate命令会清空指定数据表的全部数据内容。该命令的实际执行过程是先禁用表,再删除表,最后重新创建该表(保留表属性和列族)。

用法格式:truncate 't1'

用法说明:清空表t1的全部数据,相当于依次执行disable,drop 命令和create 命令;执行create命令会保留该表的列族和表属性。

用法举例:在HBase Shell终端执行命令truncate 'students',输出结果如下:

Truncating 'students' table (it may take a while):

 - Disabling table...

 - Truncating table...

0 row(s) in 3.4160 seconds

提示正在truncate数据表,需要执行一段时间;先禁用表,再删除表。

17)general分组命令

general分组包含了对HBase的一些常规操作命令。

(1)status命令

status命令用于查看HBase集群状态,主要用法格式如下:

用法格式1:statusstatus 'summary'

用法格式2:status 'simple'

用法格式3:status 'summary' 

用法格式4:status 'detailed'

用法示例1:查看HBase集群状态的摘要信息

在HBase Shell终端执行statusstatus 'summary'命令,输出结果如下:

1 active master, 0 backup masters, 1 servers, 0 dead, 4.0000 average load

当前有1个活跃状态HMaster,0个备用HMaster,1个HRegionServer,0个节点宕机,平均负载4.0000。

用法示例2:查看HBase集群状态的详细信息

在HBase Shell终端执行status 'detailed'命令,部分输出结果如下:

version 1.2.0-cdh5.7.0
0 regionsInTransition
active master:  hbase:60000 1618302816574
0 backup masters
master coprocessors: []
1 live servers
    hbase:60020 1618302820172
... ...
        "students,,1616903732694.4f01199b5d09d694506b3523bb19ebac."
            numberOfStores=2, numberOfStorefiles=2, storefileUncompressedSizeMB=0, lastMajorCompactionTimestamp=0, storefileSizeMB=0, memstoreSizeMB=0, storefileIndexSizeMB=0, readRequestsCount=0, writeRequestsCount=0, rootIndexSizeKB=0, totalStaticIndexSizeKB=0, totalStaticBloomSizeKB=0, totalCompactingKVs=0, currentCompactedKVs=0, compactionProgressPct=NaN, completeSequenceId=-1, dataLocality=1.0
0 dead servers

显示HBase集群当前状态的各种详细状态参数。如Hbase软件版本,正在传输的region数,活跃maser名称,并详细列出所有数据表的运行状态详细参数。于HBase系统管理员和运维工程师可以通过该命令监控HBase集群的运行状态细节。

(2)version命令

version命令用于查看HBase的当前软件版本。

用法示例:查看HBase的当前软件版本

在HBase Shell终端执行version命令,终端输出结果如下:

1.2.0-cdh5.7.0, rUnknown, Wed Mar 23 11:46:29 PDT 2016

HBase当前软件版本是1.2.0-cdh5.7.0,并显示该版本的发布日期。

(3)whoami命令

whoami命令用于查看当前登录HBase的系统用户信息。

用法示例:查看当前登录HBase的系统用户信息

在HBase Shell终端执行whoami命令,输出结果如下:

root (auth:SIMPLE)

    groups: root

当前HBase的登录用户账号是root,用户组名称是root,认证方式是简单认证。

(4)table_help命令

table_help命令用于输出HBase数据表操作的帮助信息。

用法示例:输出HBase数据表操作的帮助信息

在HBase Shell终执行命令table_help,部分输出结果如下:   

hbase> t = create 't', 'cf'
Or, if you have already created the table, you can get a reference to it:
   hbase> t = get_table 't'
  hbase> t.put 'r', 'cf:q', 'v'
  hbase> t.scan
   hbase> t.help 'scan'
   hbase> t.enable
   hbase> t.flush
   hbase> t.disable
   hbase> t.drop

该帮助命令提示了create,get,scan,put等各种表操作的用法,还可以通过定义变量对表进行引用,因为HBase Shell本质上是一个Ruby脚本语言的解释器

18)namespace分组命令

namespace(名字空间)是HBase对数据表的逻辑分组,用于数据表的业务划分。例如微信可以把与聊天相关和朋友圈相关的数据表分别安放在不同的名字空间,以实现不同业务数据表之间的数据隔离。名字空间和数据表是一对多关系,名字空间可以包含多张数据表,一张数据表只能属于一个名字空间。HBase数据库中的NameSpace类似于MySQL数据库中的database。

下面对NameSpace分组中的常用操作命令进行详细介绍:

(1)list_namespace命令

list_namespace命令用于列出HBase当前所有的名字空间。

用法示例:列出HBase当前所有的名字空间

在HBase Shell终端执行list_namespace命令,终端输出结果如下:

NAMESPACE    

default        

hbase         

ns1           

3 row(s) in 0.3790 seconds

default是默认名字空。create命令建表操作未指定名字空间,则新建数据表都属于默认名字空间default;hbase是系统名字空间,HBase的内部系统表如namespace和meta表都属于hbase名字空间;ns1是用户自定义的名字空间。

(2)create_namespace命令

create_namespace命令用于创建一个新的名字空间。

用法格式:create_namespace 'ns1'

用法说明:创建一个名称为ns1的名字空间

用法示例:创建一个新的名字空间

在HBase Shell终端执行create_namespace 'my_namespace' 命令,终端输出结果如下:

0 row(s) in 0.1220 seconds

创建一个名称为my_namespace的名字空间。注意0 row(s)的意思不是写入了0行,而是代表创建成功。

(3)drop_namespace命令

drop_namespace命令用于删除HBase指定名称的空名字空间,该名字空间不允许包含数据表。

用法格式:drop_namespace 'ns1'

用法说明:删除名称为ns1的名字空间,ns1中不允许包含数据表。

用法示例1:删除HBase的指定名称的名字空间,该名字空间不包含任何数据表

在HBase Shell终端执行drop_namespace 'my_namespace'命令,终端输出结果如下:

0 row(s) in 0.0530 seconds

删除名称为my_namespace的名字空间,该名字空间不能包含任何数据表。0 row(s)代表删除成功。

用法示例2:删除HBase的指定名称的名字空间,该名字空间包含数据表

在HBase Shell终端执行drop_namespace 'ns1'命令,终端部分输出结果如下:

ERROR: org.apache.hadoop.hbase.constraint.ConstraintException: Only empty namespaces can be removed. Namespace ns1 has 1 tables

... ...

Here is some help for this command:

Drop the named namespace. The namespace must be empty.

尝试删除名称为ns1的名字空间,该名字空间包含数据表,提示只有空的名字空间才能被删除。

用法示例3:尝试删除HBase的默认名字空间default和系统名字空间hbase

在HBase Shell终端执行drop_namespace 'default'命令,终端部分输出结果如下:

ERROR: org.apache.hadoop.hbase.constraint.ConstraintException: Reserved namespace hbase cannot be removed.

在HBase Shell终端执行drop_namespace 'hbase'命令,终端部分输出结果如下:

ERROR: org.apache.hadoop.hbase.constraint.ConstraintException: Reserved namespace default cannot be removed.

注意默认名字空间default和系统名字空间hbase不允许被删除。

4)describe_namespace命令

describe_namespace命令用于描述指定名字空间的属性。

用法格式:describe_namespace 'ns1'

用法说明:描述指定名字空间ns1的属性信息。

用法示例:描述指定名字空间ns1的属性信息。

在HBase Shell终端执行describe_namespace 'ns1'命令,终端输出结果如下:

DESCRIPTION  

{NAME => 'ns1'}

1 row(s) in 0.0220 seconds

1 row(s)说明成功获取属性信息,名字空间的默认属性是NAME。

5)alter_namespace命令

alter_namespace命令用于给指定名字空间增加、修改或删除属性。

用法格式1:alter_namespace 'ns1', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}

用法说明:修改名字空间ns1的属性信息,增加一个属性PROPERTY_NAME,设定属性值PROPERTY_VALUE。如果该属性名已存在,则修改其属性值为PROPERTY_VALUE。METHOD => 'set'是设置属性的方法。

用法示例:给指定名字空间ns1增加一个属性PROPERTY_NAME

在HBase Shell终端执行alter_namespace 'ns1', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}命令,终端输出结果如下:

0 row(s) in 0.1230 seconds

在HBase Shell终端执行describe_namespace 'ns1'命令查看名字空间ns1的属性信息,终端输出结果如下:

DESCRIPTION             

{NAME => 'ns1', PROPERTY_NAME => 'PROPERTY_VALUE'}   

1 row(s) in 0.0260 seconds

名字空间ns1增加了一个新属性PROPERTY_NAME。

用法格式2:alter_namespace 'ns1', {METHOD => 'unset', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}

用法说明:删除名字空间ns1的属性信息,删除属性PROPERTY_NAME。METHOD => 'unset'是删除属性的方法。

用法示例:删除指定名字空间ns1的属性PROPERTY_NAME

在HBase Shell终端执行alter_namespace 'ns1', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}命令,终端输出结果如下:

0 row(s) in 0.1230 seconds

在HBase Shell终端执行describe_namespace 'ns1'命令查看名字空间ns1的属性信息,终端输出结果如下:

DESCRIPTION  

{NAME => 'ns1'}

1 row(s) in 0.0260 seconds

名字空间ns1之前的属性PROPERTY_NAME已被删除。

6)list_namespace_tables命令

list_namespace_tables命令查看指定名字空间所包含的所有数据表。

用法格式:list_namespace_tables 'ns1'

用法说明:列出名字空间ns1包含的所有数据表

用法示例1:列出系统名字空间hbase包含的所有数据表

在HBase Shell终端执行list_namespace_tables 'hbase'命令,终端输出结果如下:

TABLE   

meta      

namespace   

2 row(s) in 0.0400 seconds

系统名字空间hbase包含元数据表meta和名字空间信息表namespace。元数据表meta保存所有HBase数据表的元数据信息,namespace表保存所遇HBase的名字空间信息。

用法示例2:列出默认名字空间default包含的所有数据表

在HBase Shell终端执行list_namespace_tables 'default'命令,终端输出结果如下:

TABLE  

students

t1  

t2

3 row(s) in 0.0520 seconds

默认名字空间default当前包含三张数据表students,t1和t2。

HBase自带了两个预定义的特殊名字空间hbase和defaut。hbase是系统命名空间,用于包含HBase内部表,meta和namespace都是hbase名字空间中的内部表;创建时未明确指定名字空间,则数据表将默认属于default 空间。

请注意list_namespace_tables 'default'命令和list命令并不等效。list命令是同时列出defaut名字空间和用户自定义名字空间的数据表。

在HBase Shell终端执行list命令,终端输出结果如下:

hbase(main):028:0> list

TABLE

ns1:t1

students

t1                                                                                                                       

t2

4 row(s) in 0.0270 seconds

ns1:t1是自定义名字空间ns1中的表;students,t1和t2是默认名字空间defautl中的表。

19)snapshot分组命令

HBase快照(SnapShot)用于对HBase数据表的某个时刻的数据和状态进行备份,可避免意外删除数据导致数据丢失。HBase快照有点类似虚拟机软件的提供快照恢复功能。HBase在运行过程中不断有数据写入和删除,在某时刻对数据表做快照,可以把该时刻数据表的数据和状态固化下来。HBase快照机制可在HBase集群运行过程中对数据表的数据进行热备份,然后再通过快照进行数据恢复。HBase快照的备份过程无需拷贝任何数据,只是增加了当前表的所有HFiles文件的新指针,因此对当前集群的读写性能没有任何影响。

(1)snapshot命令

snapshot命令用于对指定的数据表做快照。

用法格式1:snapshot 'sourceTable', 'snapshotName'

用法说明:为default名字空间的sourceTable表创建名字为snapshotName的快照

用法格式2:snapshot 'namespace:sourceTable', 'snapshotName', {SKIP_FLUSH => true}

用法说明:为namespace名字空间的sourceTable表创建名字为snapshotName的快照,且做快照时跳过flush操作。

用法示例1:给默认名字空间default的students数据表作快照

在HBase Shell终端执行命令snapshot 'students', 'snapshot_students',终端输出结果如下:

0 row(s) in 0.8280 seconds

给默认名字空间的students表做快照,生成的快照名称是snapshot_students;0 row(s)表示命令执行成功。

用法示例2:给名字空间ns1的t1数据表作快照

在HBase Shell终端执行命令snapshot 'ns1:t1', 'snapshot_ns1_t1', {SKIP_FLUSH => true},终端输出结果如下:

0 row(s) in 0.3320 seconds

给名字空间ns1的t1表做快照,生成的快照名称是snapshot_ns1_t1;0 row(s)表示命令执行成功。

(2)list_snapshots命令

list_snapshots是列出快照命令,查看HBase当前的所有快照。

在HBase Shell终端执行list_snapshots命令,终端输出结果如下:

SNAPSHOT                  TABLE + CREATION TIME    

 snapshot_ns1_t1          ns1:t1 (Thu Apr 15 10:12:31 +0800 2021)

 snapshot_students        students (Thu Apr 15 10:08:20 +0800 2021)

2 row(s) in 0.0370 seconds

列出HBase当前所有快照,SNAPSHOT是快照名,TABLE + CREATION TIME是快照所属的数据表名和快照的创建时间。当前有两个快照snapshot_ns1_t1和snapshot_students,分别属于表ns1:t1和表students。

(3)clone_snapshot命令

clone_snapshot是快照克隆命令,利用快照的内容克隆出一张新的数据表。

用法格式1:clone_snapshot 'snapshotName', 'tableName'

用法说明:利用快照snapshotName在default名字空间克隆一张新数据表tableName

用法格式2:clone_snapshot 'snapshotName', 'namespace:tableName'

用法说明利用快照snapshotName在namespace名字空间克隆一张新数据表tableName

用法示例:利用快照内容克隆出一张新的数据表

在HBase Shell终端执行命令clone_snapshot 'snapshot_students', 'students_clone',终端输出结果如下:

0 row(s) in 1.7240 seconds

通过快照snapshot_students克隆出一张新的数据表students_clone;0 row(s)表示命令执行成功。利用students表的快照snapshot_students克隆出一张新的数据表students_clone,新表students_clone和原表students做快照时刻的状态和数据完全相同,而原表students可能已经写入了新的数据,或者表的结构、状态可能已发生改变。

快照克隆命令clone_snapshot执行完成后,可再执行list命令查看新生成的数据表students_clone,并执行scan 'students_clone'命令查看克隆表的数据,应该和原表students执行克隆时的数据相同。

(4)restore_snapshot命令

restore_snapshot是快照恢复命令,将原数据表的数据内容恢复到做快照时的状态。

用法格式:restore_snapshot 'snapshotName'

用法说明:利用快照snapshotName,将快照所属原数据表内容恢复到做快照时的状态。

用法示例:利用快照恢复原有的数据表

在HBase Shell终端先执行truncate 'students'命令清除students表中的全部数据,并执行scan students命令确认表数据已全部清除;

再执行disable 'students'命令禁用要进行快照恢复的表,并执行快照恢复命令restore_snapshot 'snapshot_students',

最后执行enable 'students'命令启用已恢复的表,并执行scan ‘students’命令确认表数据已全部恢复。

一个快照只会对应唯一的一张数据表,因此执行restore_snapshot命令只需指定一个参数快照名称,而无需指定要进行快照恢复的数据表名称。HBase不允许对正在运行中的数据表执行快照恢复,因此对数据表执行快照恢复之前必须先禁用该表。

快照克隆可用于HBase数据库运维和数据恢复。假如数据表的数据丢失或损坏,快照克隆可使数据表恢复到某个数据状态正确的历史时刻,但仍可能会存在部分业务数据的丢失。利用快照恢复原数据表,数据表中现有的数据将会被重置,恢复到做快照时的状态和数据,因此在生产环境执行快照恢复命令需谨慎。

19)读数据时使用过滤器进行条件过滤

为了更好的示例效果,先在students表中写入以下示例数据行:

1)在HBase Shell终端执行命令truncate 'students',先清空students表中的全部数据

2)在HBase Shell终端依次执行以下的写数据命令:

put 'students', 's001', 'info:name', 'Jack'
put 'students', 's001', 'info:age', '18'
put 'students', 's001', 'score:English', 95
put 'students', 's002', 'info:name', 'Tom'
put 'students', 's002', 'info:age', 20
put 'students', 's002', 'score:Chinese', 85
put 'students', 's002', 'score:Maths', 90
put 'students', 's003', 'info:name', 'Mike'
put 'students', 's003', 'info:age', '19'
put 'students', 's003', 'score:Chinese', 90
put 'students', 's003', 'score:Maths', 95
put 'students', 's004', 'info:name', 'Lucy'
put 'students', 's004', 'score:English', 100
put 'students', 's005', 'info:name', 'Lily'
put 'students', 's005', 'score:Chinese', 99

1)ValueFilter

ValueFilter值过滤器是根据数据列单元格的值进行过滤。值过滤器的比较方式有二进制位比较、子字符串匹配比较等。

(1)按二进制位比较

用法格式1:get 't1', 'r1', { FILTER => "ValueFilter(=, 'binary:abc')"}

用法说明:筛选出表t1中行键为r1数据列单元格值完全等于abc的数据列;t1是表名,r1是行键,FILTER是过滤器,ValueFilter是值过滤器,过滤方式是相等=,比较方式是binary二进制位(单元格值保存为字节数组)。

用法示例:在get命令中使用值过滤器以二进制方式进行数据列的等值过滤

在HBase Shell终端执行命令get 'students', 's001', { FILTER => "ValueFilter(=, 'binary:Jack')"},输出结果如下:

COLUMN           CELL   

 info:name         timestamp=1616904079253, value=Jack  

1 row(s) in 0.0390 seconds

ValueFilter(=, 'binary:Jack')是值过滤器,过滤方式是相等=,比较方式为binary二进制,Jack是用于比较的单元格值,筛选出students表的001行中单元格值等于Jack的数据列。

用法格式2:scan 't1'', { FILTER => "ValueFilter(=, 'binary:abc')"}

用法说明:筛选表t1中数据列单元格值完全等于abc的数据列;t1是表名,FILTER是过滤器,ValueFilter是值过滤器,过滤方式是相等=,比较方式是binary二进制位(单元格值保存为字节数组)。

用法示例:在scan命令中使用值过滤器以二进制方式进行数据列的等值过滤

在HBase Shell终端执行命令scan 'students', { FILTER => "ValueFilter(=, 'binary:90')" },输出结果如下:

ROW         COLUMN+CELL

 s002        column=score:Maths, timestamp=1616904079518, value=90

 s003        column=score:Chinese, timestamp=1616904079580, value=90

2 row(s) in 0.0380 seconds

筛选出students表中单元格值等于90的所有数据列;ValueFilter(=, 'binary:Jack')是值过滤器,过滤方式是相等=,比较方式是按二进制位binary,单元格值与数值90作比。

(2)按子字符串匹配比较

用法格式1:get 't1', 'r1', { FILTER => "ValueFilter(=, 'substring:abc')"}

用法说明:筛选出表t1中行键为r1的数据列单元格值包含子字符串abc的数据列,比较方式是子字符串substring匹配比较,单元格值与字符串abc进行子串匹配。

用法示例:在get命令中使用值过滤器以子字符串匹配方式进行数据列的等值过滤

HBase Shell终端执行命令get 'students', 's001', { FILTER => "ValueFilter(=, 'substring:ac')"},输出结果如下:

COLUMN           CELL  

 info:name         timestamp=1616904079253, value=Jack       

1 row(s) in 0.0290 seconds

筛选出students表的001行中单元格值字符串包含子串ac的数据列。

ValueFilter(=, 'binary:Jack')是值过滤器,过滤方式是相等=,比较方式是子字符串substring匹配,单元格值与字符串b进行子串匹配。

HBase的数据列单元格值存储格式是字节数组byte[],但是在以子字符串匹配方式进行值过滤时,会把单元格值转换为字符串再进行子串匹配。

用法格式2:scan 'r1', { FILTER => "ValueFilter(=, 'substring:abc')"}

用法说明:筛选出表t1中数据列单元格值包含子字符串abc的数据列,比较方式是子字符串substring匹配比较。

用法示例:在scan操作中使用值过滤器以子字符串匹配方式进行数据列的等值过滤

在HBase Shell终端执行命令scan 'students', { FILTER => "ValueFilter(=, 'substring:0')"},输出结果如下:

ROW          COLUMN+CELL   

 s002          column=info:age, timestamp=1616904079435, value=20      

 s002          column=score:Maths, timestamp=1616904079518, value=90  

 s003          column=score:Chinese, timestamp=1616904079580, value=90

 s004          column=score:English, timestamp=1616904079646, value=100

3 row(s) in 0.0480 seconds

筛选出students表中单元格值字符串包含子串’0’的所有数据列。

ValueFilter(=, 'binary:Jack')是值过滤器,过滤方式是相等=,比较方式是子字符串substring匹配,将单元格值转字符串并与字符串’0’进行子串匹配,。

2)QualifierFilter

QualifierFilter列描述符过滤器是只根据数据列的列描述符进行过滤,并不关注列族名称。列描述符过滤器的常用比较方式为二进制位比较。

用法格式1:get 't1', 'r1', { FILTER => "QualifierFilter(=, 'binary:abc')"}

用法说明:筛选出表t1中行键为r1且列描述符完全等于abc的数据列;t1是表名,r1是行键,FILTER是过滤器,QualifierFilter是列描述符过滤器,=过滤方式是相等,比较方式是按二进制位binary(列描述符存储格式是字节数组),列描述符和值abc做比较。

用法示例:在get操作中使用列描述符过滤器以二进制方式进行数据列的等值过滤

在HBase Shell终端执行命令

get 'students', 's001', { FILTER => "QualifierFilter(=, 'binary:name')"},输出结果如下:

COLUMN            CELL  

 info:name        timestamp=1616904079253, value=Jack                         

1 row(s) in 0.0260 seconds

筛选出students表的s001行中列描述符等于值name的数据列,

QualifierFilter(=, 'binary:age')是列描述符过滤器,过滤方式是相等=,比较方式为按二进制位binary,列描述符和值name做比较。

用法格式2:scan 't1'', { FILTER => "QualifierFilter(=, 'binary:abc)"}

用法说明:筛选表t1中修饰符完全等于abc的数据列;t1是表名,FILTER是过滤器,ValueFilter是列描述符过滤器,=比较方式是相等,binary是二进制按位比较。

例2:在scan操作中使用列描述符过滤器以二进制方式进行数据列的等值过滤

在HBase Shell终端输入命令scan 'students', { FILTER => "QualifierFilter(=, 'binary:name)"},输出结果如下:

ROW         COLUMN+CELL   

 s001       column=info:name, timestamp=1616904079253, value=Jack

 s002       column=info:name, timestamp=1616904079370, value=Tom

 s003       column=info:name, timestamp=1616904079537, value=Mike

 s004       column=info:name, timestamp=1616904079612, value=Lucy

 s005       column=info:name, timestamp=1616904079664, value=Lily

5 row(s) in 0.0710 seconds

筛选出students表中列描述符等于name的所有数据列。QualifierFilter(=, 'binary:Jack')是列描述符过滤器,过滤方式是相等=,比较方式是按二进制位binary,列描述符和值name做比较。

3)ColumnPrefixFilter

列前缀符过滤器ColumnPrefixFilter是根据数据列的列描述符的前缀进行过滤。前缀过滤必须从第一个字符开始匹配,而子字符串过滤可以从任何位置开始进行子串匹配。前缀过滤器严格区分字母大小写。

用法格式1:get 't1', 'r1', { FILTER => "ColumnPrefixFilter('abc')"}

用法说明:筛选出表t1中行键为r1且列描述符包含前缀字符串abc的数据列。

用法示例:在get操作中使用列前缀过滤器以前缀字符串匹配方式进行数据列的过滤

在HBase Shell终端执行命令get 'students', 's002', { FILTER => "ColumnPrefixFilter('Chi')"},输出结果如下:

COLUMN               CELL   

 score:Chinese       timestamp=1616904079490, value=85

1 row(s) in 0.0490 seconds

筛选出students表中行键为s002且列描述符包含前缀字符串'Chi'的数据列。ColumnPrefixFilter('Chi')是列前缀过滤器,'Chi'是用于比较的列描述符前缀字符串。

用法格式2:scan 't1', { FILTER => "ColumnPrefixFilter('abc')"}

用法说明:筛选出表t1中列描述符包含前缀字符串'abc'的所有数据列;ColumnPrefixFilter('abc')是列前缀过滤器,列修饰前缀和字符串'abc'作比较。

用法示例:在scan操作中使用列前缀过滤器以前缀匹配方式进行数据列的过滤

在HBase Shell终端输入命令scan 'students', FILTER=>"ColumnPrefixFilter(9)"

终端输出以下结果:

ROW               COLUMN+CELL  

 s002             column=score:Chinese, timestamp=1616904079490, value=85

 s003             column=score:Chinese, timestamp=1616904079580, value=90

 s005             column=score:Chinese, timestamp=1616904079681, value=99       

3 row(s) in 0.0550 seconds

筛选出students表中的列描述符包含前缀字符串Chi'的所有数据列;

ColumnPrefixFilter('Chi')是列前缀过滤器,列描述符前缀和字符串'Chi'作比较。

4)RowFilter

行键过滤器RowFilter是根据行键对数据列进行过滤。

(1)按二进制位比较

用法格式:scan 't1', { FILTER => "RowFilter(=,'binary:r1')

用法说明:筛选出表t1中行键完全等于r1的所有数据列。RowFilter(=,'binary:r1')是行键过滤器,比较方式是相等=,binary是按二进制位比较(行键存储格式为字节数组),行键和值r1作比较。

用法示例:在scan操作中根据行键以二进制比较方式对数据列进行过滤

在HBase Shell终端执行命令scan 'students', { FILTER => "RowFilter(=, 'binary:s001')"},输出结果如下:

ROW          COLUMN+CELL   

 s001         column=info:age, timestamp=1616904079340, value=18

 s001         column=info:name, timestamp=1616904079253, value=Jack  

 s001         column=score:English, timestamp=1616904079353, value=95

1 row(s) in 0.4880 seconds

筛选出students表中行键等于s001所有数据列,相当于执行命令scan 'students', { STARTROW => 's001', STOPROW =>'s002'}。

注意一般很少在get命令中使用行键过滤器,get命令必须指定唯一确定完整的行键,没有必要再对行键进行过滤。例如执行命令get 'students', 's001', { FILTER => "RowFilter(=, 'binary:s002')"}查询不到任何结果。

(2)按子字符串匹配比较

用法格式:scan 't1', { FILTER => "RowFilter(=, 'substring:abc')"}

用法说明:筛选出t1表中行键包含子字符串r的所有数据列。RowFilter(=,'binary:r1')是行键过滤器,比较方式是相等=,比较方式是子字符串substring匹配比较,单元格值与字符串abc进行子串匹配。HBase的行键是存储格式为字符数组,但是在以子字符串匹配方式进行行键过滤时,会把行键转换为字符串再进行子串匹配。

用法示例:在scan操作中根据行键以子字符串匹配方式对数据列进行过滤

在HBase Shell终端执行命令scan 'students', { FILTER => "RowFilter(=, 'substring:01')"},输出结果如下:

ROW       COLUMN+CELL

 s001      column=info:age, timestamp=1616904079340, value=18

 s001      column=info:name, timestamp=1616904079253, value=Jack

 s001      column=score:English, timestamp=1616904079353, value=95

1 row(s) in 0.0490 seconds

筛选出students表中行键包括子字符串’01’的所有数据列。

5)PrefixFilter

行键前缀过滤器PrefixFilter是根据行键的前缀进行过滤。前缀过滤必须从行键的第一个字符开始匹配,严格区分字母大小写。

用法格式:scan 't1, FILTER => "PrefixFilter('r')"

用法说明:筛选表t1中行键包含前缀字符串r的数据列;PrefixFilter是行键前缀过滤器。

用法示例:在scan操作中根据行键以前缀匹配方式对数据列过滤

HBase Shell终端执行命令scan 'students', { FILTER => "PrefixFilter('s00')"},输出结果如下:

ROW          COLUMN+CELL  

 s001        column=info:age, timestamp=1616904079340, value=18

 s001        column=info:name, timestamp=1616904079253, value=Jack

 s001        column=score:English, timestamp=1616904079353, value=95

 s002        column=info:age, timestamp=1616904079435, value=20   

 s002        column=info:name, timestamp=1616904079370, value=Tom

 s002        column=score:Chinese, timestamp=1616904079490, value=85

 s002        column=score:Maths, timestamp=1616904079518, value=90

 s003        column=info:age, timestamp=1616904079558, value=19

 s003        column=info:name, timestamp=1616904079537, value=Mike

 s003        column=score:Chinese, timestamp=1616904079580, value=90

 s003        column=score:Maths, timestamp=1616904079600, value=95

 s004        column=info:name, timestamp=1616904079612, value=Lucy         

 s004        column=score:English, timestamp=1616904079646, value=100

 s005        column=info:name, timestamp=1616904079664, value=Lily

 s005        column=score:Chinese, timestamp=1616904079681, value=99

5 row(s) in 0.0570 seconds

当前students表中所有行键的都包含s00前缀,因此所有行的所有数据列都被筛选出来。

注意一般很少在get命令中使用行键前缀过滤器,get命令必须指定唯一确定完整的行键,没有必要再对行键前缀进行过滤。

6)FamilyFilter

列族过滤器FamilyFilter是根据列族名称进行过滤。列族过滤器的比较方式有二进制位比较、子字符串匹配比较等。

用法格式1:scan 't1', FILTER => "FamilyFilter(=,'binary:f1')"

用法说明:筛选出t1表中所属列族名等于f1的所有数据列。"FamilyFilter(=,'binary:f1')是列族过滤器,比较方式是相等=,binary是按二进制位比较(行键存储格式为字节数组),列族名和f1作比较。列族过滤器严格区分字母大小写。

用法示例:在scan操作中使用列族过滤器以二进制方式根据列族名称对数据列过滤

在HBase Shell终端执行命令scan 'students', FILTER => "FamilyFilter(=,'binary:info')",输出结果如下:

ROW             COLUMN+CELL  

 s001           column=info:age, timestamp=1616904079340, value=18   

 s001           column=info:name, timestamp=1616904079253, value=Jack  

 s002           column=info:age, timestamp=1616904079435, value=20     

 s002           column=info:name, timestamp=1616904079370, value=Tom  

 s003           column=info:age, timestamp=1616904079558, value=19     

 s003           column=info:name, timestamp=1616904079537, value=Mike  

 s004           column=info:name, timestamp=1616904079612, value=Lucy   

 s005           column=info:name, timestamp=1616904079664, value=Lily    

5 row(s) in 0.1660 seconds

students表中当前所有属于info列族的数据列都被筛选出来。本命令等效于执行命令scan 'students', COLUMNS => ['info']。

用法格式2:scan 't1', FILTER => "FamilyFilter(=,'substring:f')"

说明:筛选出t1表中所属列族名包含子字符串f的所有数据列。FamilyFilter(=,'substring:f')是列族过滤器,比较方式是相等=,比较方式是子字符串substring匹配比较,列族名与字符串f进行子串匹配。列族过滤器严格区分字母大小写。

用法示例:在scan操作中使用列族过滤器以子字符串匹配方式根据列族名称对数据列过滤

在HBase Shell终端执行命令scan 'students', FILTER => "FamilyFilter(=,'substring:o')",输出结果如下:

ROW            COLUMN+CELL  

 s001          column=info:age, timestamp=1616904079340, value=18  

 s001          column=info:name, timestamp=1616904079253, value=Jack  

 s001          column=score:English, timestamp=1616904079353, value=95  

 s002          column=info:age, timestamp=1616904079435, value=20    

 s002          column=info:name, timestamp=1616904079370, value=Tom   

 s002          column=score:Chinese, timestamp=1616904079490, value=85  

 s002          column=score:Maths, timestamp=1616904079518, value=90   

 s003          column=info:age, timestamp=1616904079558, value=19      

 s003          column=info:name, timestamp=1616904079537, value=Mike   

 s003          column=score:Chinese, timestamp=1616904079580, value=90  

 s003          column=score:Maths, timestamp=1616904079600, value=95   

 s004          column=info:name, timestamp=1616904079612, value=Lucy   

 s004          column=score:English, timestamp=1616904079646, value=100

 s005          column=info:name, timestamp=1616904079664, value=Lily    

 s005          column=score:Chinese, timestamp=1616904079681, value=99  

5 row(s) in 0.0270 seconds

students表中当前列族名称info和score都包含子字符串o,因此所有属于info列族和score列族的数据列都被筛选出来。

由于性能考虑,要求HBase表设计中列族一般不超过3个,因此一般很少使用列族过滤器去筛选出所属列族名称符合条件的的数据列。只需执行命令scan 't1', COLUMNS => ['f1']扫描属于指定列族的所有数据列。如果想找到列族名符合条件的列族,只需执行desc命令即可查看到数据表的所有列族。

HBase数据表中列族名称是在创建表时事先定义的固定的,所有数据行的列族都是相同的。因此在指定行键的查询中根据列族名进行筛选意义不大,一般不在get命令中使用列族过滤器。例如查找指定行键和列族的数据列,一般不使用命令get 'students', 's001', FILTER => "FamilyFilter(=,'binary:score')",而是使用命令get 'students', 's001', 'info'。

7)SingleColumnValueFilters

单列值过滤器SingleColumnValueFilters是根据指定列族和列描述符的单个数据列的单元格值进行过滤,类似SQL中的”select 列名 from 表名 where列名=值”语句。

(1)按二进制位比较

用法格式:

scan't1', {COLUMN=>'f1:q1' , FILTER=>"SingleColumnValueFilter(f1,q1, =,'binary:value')"}

用法说明:筛选出数据列f1:q1的单元格值等于value的数据列。

其中SingleColumnValueFilter(f1,q1, =,'binary:value')" 是单列值过滤器,=比较方式是相等,binary是比较方式为二进制位比较,在t1表中根据指定列族f1和列描述符q1。

用法示例:在scan操作中使用单列值缀过滤器根据单元格值以二进制比较方式对数据列进行过滤。

在HBase Shell终端执行命令scan 'students', {COLUMN => 'info:age', FILTER => "SingleColumnValueFilter('info','age',=,'binary:19')"},输出结果如下:

ROW          COLUMN+CELL                             

 s003        column=info:age, timestamp=1616904079558, value=19

1 row(s) in 0.0260 seconds

筛选出students表中指定数据列info:age的单元格值等于19的数据列。注意单列值过滤器中必须指定准确的列族名、列描述符和单元格值,否则无法过滤出正确的结果。

(2)按子字符串匹配比较

用法格式:

scan't1', {COLUMN=>'f1:q1' , FILTER=>"SingleColumnValueFilter(f1,q1, =,'substring:abc')" }

用法说明:筛选出数据列f1:q1的单元格值包含子字符串abc的数据列。

其中SingleColumnValueFilter(f1,q1, =,'binary:value')" 是单列值过滤器,=比较方式是相等,substring是比较方式为子字符串匹配比较,abc是用于和单元格值比较的子字符串。

HBase的单元格值存储为字符数组,但是在以子字符串匹配方式进行单元格值过滤时,会把单元格值转换为字符串再进行子串匹配。

用法示例:在scan操作中使用单列值缀过滤器根据单元格值以子字符串匹配比较方式对指定数据列进行过滤。

在HBase Shell终端执行命令scan 'students', {COLUMN => 'info:name', FILTER => "SingleColumnValueFilter('info','name',=,'substring:y')"},输出结果如下:

ROW       COLUMN+CELL                                    

 s004     column=info:name, timestamp=1616904079612, value=Lucy  

 s005     column=info:name, timestamp=1616904079664, value=Lily    

2 row(s) in 0.0380 seconds

说明:筛选出students表中指定数据列info:name的单元格值包含子字符串y的数据列。

例3:在scan操作中使用单列值过滤器但不指定数据列进行过滤

在HBase Shell终端执行命令

scan 'students', { FILTER => "SingleColumnValueFilter('score','English',=,'binary:100')"},终端输出结果如下:

ROW      COLUMN+CELL   

 s002   column=info:age, timestamp=1616904079435, value=20  

 s002   column=info:name, timestamp=1616904079370, value=Tom

 s002   column=score:Chinese, timestamp=1616904079490, value=85   

 s002   column=score:Maths, timestamp=1616904079518, value=90  

 s003   column=info:age, timestamp=1616904079558, value=19      

 s003   column=info:name, timestamp=1616904079537, value=Mike   

 s003   column=score:Chinese, timestamp=1616904079580, value=90   

 s003   column=score:Maths, timestamp=1616904079600, value=95    

 s004   column=info:name, timestamp=1616904079612, value=Lucy    

 s004   column=score:English, timestamp=1616904079646, value=100   

 s005   column=info:name, timestamp=1616904079664, value=Lily    

 s005   column=score:Chinese, timestamp=1616904079681, value=99    

4 row(s) in 0.0430 seconds

请注意,单列值过滤器的作用比较特别。如果不指定数据列COLUMN => 'score:English',不仅会把符合过滤条件的s005行的数据列score:English筛选出来,也会把s005行的其他数据列也筛选出来,而且会把其他不包含数据列score:English的数据行都筛选出来。s002,s004和s005行都不包含数据列score:English,所以被筛选出来;s001行包含score:English数据列,但是列值不满足过滤条件,因此没有被筛选出来。

8)TimestampsFilter

时间戳过滤器TimestampsFilter是根据指定的时间戳版本进行过滤,筛选出指定时间戳版本的数据列单元格。

用法格式:scan 't1', { FILTER => "TimestampsFilter (ts1, ts2, ts3)"}

用法说明:TimestampsFilter (ts1, ts2, ts3)是时间戳过滤器,筛选出时间戳版本值等于ts1或ts2或ts3的单元格

用法示例:筛选出时间戳版本值包含在指定时间戳列表中的数据列。

在HBase Shell终端执行命令scan 'students', { FILTER => "TimestampsFilter (1616904079435, 1616904079537, 1616904079681)"},输出结果如下:

ROW          COLUMN+CELL

 s002        column=info:age, timestamp=1616904079435, value=20      

 s003        column=info:name, timestamp=1616904079537, value=Mike

 s005        column=score:Chinese, timestamp=1616904079681, value=99                                  

3 row(s) in 0.0560 seconds

筛选出时间戳版本值包含在指定时间戳列表中的数据列。

9)多种过滤器的组合用法

在scan命令使用多种过滤器的组合,筛选出符合多种过滤条件的结果。终端输入scan命令后HBase Shell输出得命令用法提示中,包含一种scan命令的复杂用法格式如下:

scan 't1', {ROWPREFIXFILTER => 'row2', FILTER => "(QualifierFilter (>=, 'binary:xyz)) AND (TimestampsFilter (123,456))"}

用法说明:筛选出表t1中行键前缀为row2,列名为xyz,且时间戳等于123或456的数据列。其中t1是表名,ROWPREFIXFILTER是行键前缀过滤器,QualifierFilter是列修饰符过滤器,TimestampsFilter是时间戳过滤器。类似于SQL语句select xyz from t1 where rowid like ‘row2?’ AND (TimestampsFilter=123 OR TimestampsFilter=456)。

用法示例1:筛选出行键前缀字符串、数据列名和时间戳版本值都符合条件的数据列

在HBase Shell终端执行命令scan 'students', {ROWPREFIXFILTER => 's00', FILTER => "(QualifierFilter (=, 'binary:name')) AND (TimestampsFilter (1616904079253))"},输出结果如下:

ROW    COLUMN+CELL    

 s001    column=info:name, timestamp=1616904079253, value=Jack  

1 row(s) in 0.0610 second

筛选出students中行键包含前缀字符串s00,数据列名为name,时间戳版本值为1616904079253的数据列单元格。

用法示例2:筛选出行键前缀字符串、数据列名子字符串和时间戳版本值都符合条件的数据列单元格

在HBase Shell终端执行命令scan 'students', {ROWPREFIXFILTER => 's00', FILTER => "(QualifierFilter (=, 'substring:am')) AND (TimestampsFilter (1616904079253))"},输出结果如下:

ROW    COLUMN+CELL    

 s001    column=info:name, timestamp=1616904079253, value=Jack  

1 row(s) in 0.0220 seconds

筛选出行键包含前缀字符串s00,数据列名包含子字符串为am,时间戳版本值为1616904079253的数据列。

20)tools分组命令

toos分组中有很多HBase工具类高级操作命令,其中包含对Region的操作管理命令。

1)split命令

split命令是数据表的Region拆分命令,可以根据指定的拆分行键对Region进行拆分。

用法格式:split 'tableName', 'splitKey'

用法说明:将数据表tableName的Region从行键值为splitKey的位置进行拆分。

用法举例:将students表的region从行键为s003的数据行进行拆分

在HBase Shell终端执行命令split 'students', 's003',终端输出结果如下:

0 row(s) in 0.1120 seconds

0 row(s)表示命令执行成功。

在HBase Shell终端执行get_splits 'students'命令,查看Region的拆分结果如下:

Total number of splits = 2

=> ["s003"]

拆分的分区数量为2,拆分位置是行键s003的数据行。

还可登录HBase自带web页面查看数据表的分区情况如图6-2所示:

第1个Region的End Key和第2个Region的Start Key都等于拆分行键s003。

3)merge_region命令

merge_region命令是Region合并命令,用于对指定的Region进行合并。

用法格式:merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME'

用法说明:根据指定Region编码值对两个Region进行合并

用法举例:合并students表的两个Region,可在HBase自带web页面http://192.168.56.10:60010/的Table Regions中查看Region的编码值(位于两个点号之间):

students,,1618662106381.5b512283f22732e6537569a67447534f.

students,s003,1618662106381.ea3f16c088084f27eecf4b82eab97fed.

在HBase Shell终端执行以下命令merge_region 'a98371b7e5f6e90766fcc196a3854f44', '89602bb7415cd2818ef0e634e452e55f',输出结果如下:

0 row(s) in 0.0890 seconds

在HBase Shell终端执行get_splits 'students'命令,查看Region的合并结果如下:

Total number of splits = 1

=> []

分区总数量为1,说明原来的2个Region已合并为1个Region。

2)move命令

move命令是Region移动命令,用于对指定的Region进行移动。

用法格式:move 'ENCODED_REGIONNAME'

用法说明:将指定Region编码值的Region移动到随机一个RegionServer

用法举例:移动students表的一个指定Region,可在HBase自带web页面的Table Regions中查看Region的编码值(位于两个点号之间):

students,,1618662106381.5b512283f22732e6537569a67447534f.

在HBase Shell终端执行以下命令move '5b512283f22732e6537569a67447534f',终端输出结果如下:

0 row(s) in 0.0540 seconds

可登录HBase自带web页面查看数据表的分区情况。在有多个RegionServer的HBase分布式集群执行move命令,才能看到Region的实际移动效果。

21)其他命令

(1)alter_async命令

alter_async命令是异步修改表命令,用于异步修改表列族的属性而无需等待所有Region都完成模式(列族属性)更新。

用法格式:alter_async 't1', NAME => 'f1', VERSIONS => 5

用法说明:异步更新数据表t1的模式,将其列族f1的版本数VERSIONS 修改为5。

用法举例:对数据表t1执行表模式的异步更新。

在HBase Shell终端执行alter_async 't1', NAME => 'f1', VERSIONS => 5命令,输出结果如下:

0 row(s) in 0.9540 seconds

0 row(s) 表示命令执行成功。该命令和alter命令功能差不多,唯一不同是对表模式的修改是异步的,无需等待所有更新完成命令即返回。

(2)alter_status命令

alter_status是表模式更新状态查看命令,用于查看数据表每个Region的异步更新状况。获取alter命令的执行状态,表明已有多少region已完成模式(列族属性)更新。该命令在执行异步更新表时可以用于查看alter_async命令执行的情况,判断该命令是否执行完毕。

用法格式:alter_status 't1'

用法说明:异步更新数据表t1的模式,将其列族f1的版本数VERSIONS 修改为5。

用法举例:查看数据表t1的表模式更新状态

在HBase Shell终端执行alter_status 't1'命令,输出结果如下:

1/1 regions updated.

Done.

含义该表总共有1个Region,完成表模式更新了1个Region。

(3)locate_region命令

locate_region是Region寻址命令,用于根据指定行键来定位某一数据行所属Region位于哪个RegionServer节点。该命令实际是对HBase的元数据表hbase:meta进行查询。

用法格式:locate_region 'tableName', 'key0'

用法说明:根据指定行键key0定位数据表'tableName'的key0行所在的Region位置。

用法举例:定位数据表students的s001行数据所在的Region位置

HOST      REGION

 hbase:60020    {ENCODED => 7b5d6520acc45e83cf401b52b2f41663, NAME => 'students,,1618652901895.7b5d6520acc45e83cf401b52b2f41663.', STARTKEY => '', ENDKEY => ''}

1 row(s) in 0.0270 seconds

表students的s001行数据所属Region位于的RegionServer主机名称是HBase:60020,并描述该Region的详细信息,包括表名、Region编码、起止行键等。

========================================================================

HBase Shell模拟题:

业务场景实例:HBase客户订单商品表的逻辑数据模型

row key

 

column family

customer

column family

order

column family

item

qualifier

cell value

qualifier

cell value

qualifier

cell value

00000000001-Jack

name

Jack

number

1

item_name

iphone8

00000000001-Jack

phone

00000000001

datetime

2020-04-21 12:17:21

price

¥8000.00

00000000001-Jack

address

Wu Han

pay-state

not payed

 

 

00000000001-Jack

level

normal

 

 

 

 

00000000002-Tom

name

Tom

number

2

item_name

HUWEI MATE X2

00000000002-Tom

phone

00000000002

datetime

2020-04-22 13:27:45

price

¥6000.00

00000000002-Tom

address

Bei Jing

 

 

 

 

00000000002-Tom

preference

e-product

 

 

 

 

00000000003-Mike

name

Mike

number

3

item_name

XIAO MI 11

00000000003-Mike

phone

00000000003

datetime

2020-04-23 00:17:01

price

¥5000.00

00000000003-Mike

address

Shang Hai

 

 

 

 

00000000003-Mike

age

20

 

 

 

 

00000000004-Lucy

name

Lucy

number

5

item_name

Lancome

00000000004-Lucy

phone

00000000004

datetime

2020-04-23 09:34:18

price

¥10000.00

00000000004-Lucy

address

Hang Zhou

pay-state

payed

 

 

00000000004-Lucy

preference

Cosmetics

post-state

recieved

 

 

00000000004-Lucy

level

VIP

 

 

 

 

00000000005-Lily

name

Lily

number

10

item_name

LV

00000000005-Lily

phone

00000000005

datetime

2020-04-23 01:49:1

price

¥20000.00

00000000005-Lily

preference

handbag

pay-state

payed

 

 

00000000005-Lily

level

VIP

post-state

delivered

 

 

00000000005-Lily

email

abc@qq.com

 

 

 

 

英文解释:
row key 行键  
column family 列族  
qualifier 列描述符(列名)   
cell value单元格值
customer 客户
order 订单
Item  商品
Name 客户姓名
phone电话号码
address住址  
preference爱好
level客户级别
number商品数量
datetime购买时间
item_name 商品名称  
price价格
pay-state 支付状态
post-state  邮递状态
email 电子邮箱

HBase Shell模拟考试题目:

第1题  创建一个名称为eshop的名字空间,并列出所有名字空间

第2题  在eshop名字空间中创建一张新的数据表,表名为shopping,包含1个列族customer;再列出HBase的所有数据表。

第3题 给eshop名字空间中的shopping表增加两个新的列族order和item

第4题 先删除shopping表后再重新创建shopping表,包含3个列族customer,order和item

第5题 修改shopping表的表级别属性,将文件大小最大值修改为134217728字节

第6题 描述shopping表的列族属性信息

第7题 将客户订单商品表shopping逻辑数据模型中的所有数据写入到shooping表中

第8题 对shopping表进行全表扫描(读取所有数据行的所有数据列单元格)

第9题 读取shopping表的行键为00000000004-Lucy的所有数据列的单元格值

第10题 读取shopping表的行键为00000000005-Lily,列族为customer,列描述符为preference的数据列的单元格值

第11题 修改shopping表的列族属性,将其列族order的列族属性VERSIONS 修改为3

第12题 修改shopping表的列族属性,将其列族order的列族属性TTL生存时间修改为1周,压缩模式修改为gz

第13题 将shopping表的行键为00000000001-Jack,列族为order,列描述符为number的数据列的单元格值依次修改为2和3

第14题 读取shopping表客户Jack的订单中商品数量的最新3次的版本值

第15题 对shopping表指定行键范围00000000002-Tom到00000000004-Lucy的数据行进行扫描,扫描结果包括第00000000002-Tom行,也包括第00000000004-Lucy行

第16题 对shopping表的列族customer中的所有数据列进行扫描

第17题 对shopping表的列族customer中列名为phone的所有数据列进行扫描

第18题  对shopping表的前3行数据进行扫描

第19题 统计shopping表中的数据行数

第20题 删除shopping表的行键为00000000005-Lily,列族为customer,列描述符为email的数据列

第21题 给shopping表的行键为00000000003-Mike,列族为item,列描述符为item_name的数据列单元格值追加内容 Ultra

第22题 查看HBase集群状态的详细信息,并查看HBase的当前软件版本

第23题 创建一个新的名字空间new_ns,并列出HBase当前所有的名字空间

第24题 删除名称为new_ns的名字空间

第25题 给默认名字空间default增加一个属性名user,属性值root

第26题 描述默认名字空间default的属性信息

第27题 列出系统名字空间hbase中包含的所有数据表

第28题 给自定义名字空间eshop中的shopping数据表创建名称为snapshot_eshop_shopping的快照

第29题 查看HBase当前的所有快照
参考答案:list_snapshots

第30题 利用快照snapshot_eshop_shopping在eshop名字空间克隆出一张新的数据表shopping_clone

第31题 先清空eshop:shopping表中的全部数据,再将该表的数据恢复到快照snapshot_eshop_shopping时的状态

第32题 执行scan命令,使用ValueFilter过滤器筛选出eshop:shopping表中单元格值等于Wu Han的所有数据

第33题 执行scan命令,使用QualifierFilter过滤器筛选出eshop:shopping表中列名(qualifier)包含子字符串re的所有数据

第34题 执行scan命令,使用ColumnPrefixFilter过滤器筛选出eshop:shopping表中列名(qualifier)前缀为date的所有数据

第35题 执行scan命令,使用RowFilter过滤器筛选出eshop:shopping表中行键(row key)包含子字符串-L的所有数据

第36题 执行scan命令,使用PrefixFilter过滤器筛选出eshop:shopping表中行键(row key)前缀为00000000001的所有数据

第37题 执行scan命令,使用FamilyFilter过滤器筛选出eshop:shopping表中列族(column family)名称包含子字符串er的所有数据列

第38题 执行scan命令,使用SingleColumnValueFilter过滤器筛选出订单商品表shopping中客户爱好包含子字符串c的所有数据

第39题 将eshop:shopping表从行键值为00000000003-Mike的位置进行Region的拆分,并执行get_splits命令查看eshop:shopping表的Region拆分结果

第40题 先用浏览器打开HBase的web配置页面,查看eshop:shopping表的所有Region的编码值;再执行merge_region命令对eshop:shopping表之前拆分(第39题)的两个Region进行合并。