您现在的位置是:首页 >技术杂谈 >HBase Shell命令行操作实验网站首页技术杂谈
HBase Shell命令行操作实验
1 HBase的访问方式和HBase Shell
1.1 HBase Shell命令行终端
1.进入HBase Shell终端环境
HBase Shell是由Apache HBase官方提供的Shell命令行操作接口,是一个基于Ruby脚本语言的终端环境。利用HBase Shell用户可以方便地执行终端命令来操作HBase,进行HBase数据表的创建、删除和修改,列出表信息,读取表数据,插入表数据,删除表数据等操作。
进入HBase shell终端环境之前,要先在Linux Shell命令行终端执行start-dfs.sh 脚本启动HDFS,再执行start-hbase 脚本启动HBase。如果Linux系统已配置HBase环境变量,可直接在Linux Shell命令行终端执行hbase shell脚本命令,即可进入HBase Shell的命令行终端环境。Hbase脚本文件位于HBase安装目录的bin子目录。执行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.0, rUnknown, Wed Mar 23 11:46:29 PDT 2016
hbase(main):001:0>
成功进入HBase Shell终端环境后,会出现hbase(main):000:0>提示符,可在提示符后输入要执行的命令并回车执行。如果直接回车或输入命令后回车,提示符中的数字序号会依次递增,数字序号初始值是001。终端输出结果如下:
hbase(main):001:0> list
hbase(main):002:0>
hbase(main):003:0*
hbase(main):004:0*
hbase(main):005:0*
2 HBase Shell命令行的基础操作命令
本节主要介绍HBase Shell命令行的各种基础操作命令的用法格式、用法说明和用法示例,应能熟练掌握HBase Shell命令行的基础操作命令。
2.1 DDL分组的操作命令
DDL分组中包含的操作命令很多,主要用于对HBase数据库表的相关管理操作,主要包括创建表、修改表、删除表、列出表、启用表、禁用表等操作
下面对DDL分组中的常用操作命令进行详细介绍。
- list命令
list是列出数据表命令。进入HBase shell后可以先执行list命令列出HBase当前所有数据表的表名。
用法格式:list
用法说明:列出默认名字空间default和自定义名字空间中的所有数据表,命令后面不跟任何参数。
用法示例:默认名字空间default和自定义名字空间中的所有数据表
HBase Shell终端输入list后按回车键,输出结果如下:
TABLE
t1
t2
2 row(s) in 0.0140 seconds
=> ["t1", "t2"]
说明:TABLE后面的每行字符串t1和t2都是表名,2 row(s)是所列出的所有表的数量。list命令实际是对元数据表hbase:meta表进行查询。元数据表存放HBase所有数据表的元数据信息。另外,HBase当前没有自定义名字空间。
- exists命令
exists是表存在判断命令,用于判断指定表名的数据表是否存在。
用法格式1:exists 't1'
用法说明:判断默认名字空间default中是否存在表名为t1的数据表
用法格式2:exists 'ns1:t1'
用法说明:判断指定名字空间 ns1中是否存在表名为t1的数据表
用法示例:判断表t1是否存在
HBase Shell终端执行exists 't1'命令,输出结果如下:
Table t1 does exist
0 row(s) in 0.0750 seconds
说明:默认名字空间default中存在表名为't1的数据表。
- describe命令
describe是表属性描述命令,主要描述HBase表和列族的属性,可以缩写为desc。
用法格式1:describe 't1'或desc 't1'
用法说明:描述默认名字空间defaut中的数据表t1的列族属性
用法格式2:describe 'ns1:t1'或desc 'ns1:t1'
用法说明:描述指定名字空间 ns1中的的数据表t1的列族属性;
用法示例:描述表t1的列族属性
HBase shell终端执行describe ’t1’或desc ’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',
{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表的列族是预先定义的,物理上是互相分离的。在各种应用场景中,经常为了提升HBase集群性能而进行性能调优,而HBase表列族中的多个属性都可用于性能调优。
- 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:在默认名字空间创建students表
在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:创建名字空间ns1
HBase shell终端依次执行命令create_namespace 'ns1',输出结果如下:
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
用法示例3:在ns1名字空间创建t1表,包含一个列族f1,设置最大版本数5
HBase shell终端依次执行create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}、list和desc 'ns1:t1'命令,输出结果如下:
hbase(main):023:0> create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}
0 row(s) in 1.2650 seconds
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。注意如果要创建的表已存在,则不允许重复创建。重复执行create命令HBase Shell终端会提示错误:ERROR: Table already exists: students!
- alter命令
alter是修改表命令,在HBase Shell终端只输入alter后按回车,会提示alter命令的各种用法。alter命令的一般格式是alter t1, ATTRNAME=>ATTRVALUE,该命令功能强大,用法复杂,可先掌握简单常用的用法。alter命令能执行列族级别、数据表级别和集群级别的修改操作。
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 'students', NAME=>'score';第1行提示更新所有的regions为新的表模式;增加、删除列族及修改列族属性都会导致表结构的更新,学习HBase体系架构得知由HMaser负责表结构的更新;alter命令执行后可再执行desc ‘students’命令查看对列族属性的修改,会发现多了一个score列族的属性描述。
如果要增加的列族不存在,alter命令作用是增加一个新的列族;如果要增加列族已经存在,alter命令作用可以是修改指定列族的属性或删除指定列族。
用法格式2:alter ‘t1’, NAME=>‘f1’, ATTRNAME=>ATTRVALUE
用法说明:修改数据表t1,修改列族f1的属性名为ATTRNAME的属性值为ATTRVALUE。
用法示例1:修改表students的列族属性VERSION
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'。注意不能用简写形式的命令alter 'students', 'info', VERSIONS => '3',虽然命令能执行但是不会生效。
用法示例2:修改表students的列族属性COMPRESSION
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命令来修改其对应的属性值。
用法示例3:修改表students的列族属性TTL
HBase shell终端执行alter "students", NAME=>'info', TTL=>'300'命令输出结果如下:
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.9710 seconds
说明:将students表的info列族的TTL生存时间修改为300秒。300秒后再执行scan ‘students’命令,会发现info列族的数据都不见了,因为超过TTL时间的数据在执行HFile文件小缩并时被清除。
用法格式3:alter 't1', NAME => 'f1', METHOD => 'delete'或alter 't1', 'delete' => 'f1'
用法说明:修改数据表t1,对其列族名为f1的列族执行删除操作。
用法示例:删除表students的列族score
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列族已经不存在。请注意执行列族删除操作会将属于该列族的所有数据列全部删除且无任何提示,因此执行该命令需谨慎。还需注意数据表的唯一列族不允许被删除。执行alter 'students', NAME => 'score', METHOD => 'delete'命令删除数据表students的唯一列族info,终端会给出错误删除提示:
ERROR: org.apache.hadoop.hbase.InvalidFamilyOperationException: Family 'info' is the only column family in the table, so it cannot be deleted
2)数据表级别
数据表级别的修改操作主要是修改数据表级别的属性,这些属性属于一整张表。
用法格式:alter ‘t1’, ATTRNAME1=>ATTRVALUE1, ATTRNAME2=>ATTRVALUE2, ....
用法说明:修改表t1的表级别属性ATTRNAME1、ATTRNAME2...
数据表级别操作允许的属性必须是表级别的属性用法示例:修改表students的表级别属性MAX_FILESIZE
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文件个数达到该值则阻塞数据写入操作。若指定列族名,该配置属性只针对数据表的某列族有效。
alter命令修改集群级别配置参数的优先级高于配置文件hbase-site.xml中相同参数的优先级,hbase-site.xml中的配置参数优先级高于hbase-default.xml文件中的相同参数的优先级。
用法格式1:alter 't1', { CONFIGURATION=> {ATTRNAME => ATTRVALUE}}
用法说明:修改表t1的集群级别配置参数ATTRNAME,修改对整个数据表t1均有效。
用法示例:修改将数据表students的集群级别配置参数
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
说明:将数据表students的配置参数hbase.hstore.blockingStoreFile修改为15。修改完成后可执行desc ‘students’命令,查看对集群配置参数的修改结果如下:
students,{TABLE_ATTRIBUTES=>{MAX_FILESIZE=>'134217728',CONFIGURATION=>{'hbase.hstore.blockingStoreFile' => '15'}。
用法格式2:alter 't1', { NAME => 'f1', CONFIGURATION=> {ATTRNAME => ATTRVALUE}}
用法说明:修改表t1的集群级别配置参数ATTRNAME,修改只对表t1的列族f1有效。
用法示例:修改将数据表students的集群级别配置参数
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
说明:将students数据表的info列族的hbase.hstore.blockingStoreFiles属性值修改为15,而不会影响整个数据表或数据表的其他列族。修改完成后可执行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'}}
- disable命令
disable是禁用表命令,用于禁用指定表名的数据表。
用法格式1:disable 't1'
用法说明:禁用默认名字空间default表名为t1的数据表
用法格式2:disable 'ns1:t1'
用法说明:禁用指定名字空间ns1中表名为t1的数据表
用法示例:禁用默认名字空间的数据表students
HBase Shell终端执行disable 'students'命令,输出结果如下:
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表示已禁用。
- enable命令
enable是启用表命令,用于启用指定表名的数据表。
用法格式1:enable 't1'
用法说明:启用默认名字空间default表名为t1的数据表
用法格式2:enable 'ns1:t1'
用法说明:启用指定名字空间ns1中表名为t1的数据表
用法示例:启用默认名字空间的数据表students
HBase Shell终端执行enable 'students'命令,输出结果如下:
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表示已启用。
- drop命令
drop是删除表命令,用于删除指定表名的数据表,只能删除已禁用的数据表。即使表中有数据也会直接被删除,表中数据会丢失,因此执行该命令需谨慎。
用法格式1:drop 't1'
用法说明:删除默认名字空间default表名为t1的数据表
用法格式2:drop 'ns1:t1'
用法说明:删除指定名字空间ns1中表名为t1的数据表
用法示例:删除默认名字空间的数据表students
HBase Shell终端执行drop 'students'命令,部分输出结果如下:
ERROR: Table students is enabled. Disable it first.
Here is some help for this command:
Drop the named table. Table must first be disabled
删除指定名称的数据表时,该表必须首先被禁用。
HBase Shell终端先执行disable 'students'命令,再执行drop 'students'命令,部分输出结果如下:
0 row(s) in 1.3170 seconds
说明:0 row(s) 表示命令执行成功
执行list命令看不到students表说明已被成功删除。
- alter_async命令
alter_async命令是异步修改表命令,用于异步修改表列族的属性。
用法格式:alter_async 't1', NAME => 'f1, VERSIONS => 5
用法说明:异步更新数据表t1的模式,将其列族f1的版本数VERSIONS 修改为5。
用法示例:对数据表students执行表模式的异步更新。
在HBase Shell终端执行alter_async 'students', NAME => 'info', VERSIONS => 5命令,输出结果如下:
0 row(s) in 0.9540 seconds
说明:0 row(s) 表示命令执行成功。该命令和alter命令功能差不多,唯一不同是对表模式的修改是异步的,命令执行后会立即返回,不会等待所有Region列族属性更新完成。
- 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完成表模式更新。
- locate_region命令
locate_region是Region寻址命令,用于根据指定行键来定位某一数据行所属Region位于哪个RegionServer节点。该命令实际是对HBase的元数据表hbase:meta进行查询。
用法格式:locate_region 'tableName', 'key0'
用法说明:根据指定行键key0定位数据表'tableName'的key0行所在的Region位置。
用法示例:定位数据表students的s001行数据所在的Region位置
在HBase Shell终端执行locate_region 'students', 's001命令,输出结果如下:
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编码、起止行键等。
2.2 DML分组的操作命令
- DML分组中包含的操作命令很多,主要用于对数据表中的数据进行操作,主要包括全表扫描、读取单行数据、写入数据和删除数据等操作。
- 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’, ‘001’查看刚写入的数据列单元格,输出结果如下:
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允许列名中的列限定符为空。但是行键、列族、时间戳、单元格值都不能为空(如put命令未指定时间戳则会取当前系统时间作为时间戳)。
用法示例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列族中的行键相同,才能将学生的基本信息和学生的成绩信息建立关联。
- 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', 's001', '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指定要读取的数据列单元格值的版本数,不能小于等于0,可以超过列族属性中设定的最大版本数,但只会显示实际写入的版本数。
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的属性设定的最大版本数量为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能够精确查出数据列单元格指定时间戳的版本值,时间戳值必须精确到毫秒。
- 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则会扫描到数据表最后一行。
用法示例:对student表的指定行键范围的数据进行扫描
为了更好的示例效果,先在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'
在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行数据,如果n小于等于0则扫描所有行。
用法示例:对student表的前3行进行扫描
在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。
用法示例:对student表的指定时间戳范围的数据列单元格进行扫描
在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
说明:报错原因是执行原始扫描不能指定任何列。
- count命令
count命令用于统计指定数据表的数据行数。
用法格式:count 't1'
用法说明:统计表t1的数据行数。
用法举例:统计表students的数据行数
在HBase Shell终端执行命令count 'students',输出结果如下:
5 row(s) in 0.0120 seconds
=> 5
说明:当前students表中总共有5行数据。类似SQL中的select count(*) from students语句。
- 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
说明:删除students表的行键为001,列名为scores:Chinese的数据列。0 row(s)中的数字0表示删除命令执行成功。delete命令无论是否真正删除数据都会返回0 row(s)。可执行scan 'students'命令确认是否删除成功。
用法格式2:delete 't1', 'r1', 'c1', ts
用法说明:删除表t1中行键为r1、列名为c1、时间戳小于等于ts的数据列单元格,其中t1是表名,r1是行键,c1是列名,ts是时间戳值。delete命令中的时间戳ts是指定一个时间戳范围,会把指定列的时间戳值小于等于该时间戳的单元格都删除掉。
用法示例:删除数据表students的指定数据列单元格
在HBase Shell终端执行命令delete 'students', 's001', 'score:Maths', 1616734285113,输出结果如下:
0 row(s) in 0.0340 seconds
说明:删除students表的行键为001,列名为scores:Maths,时间戳为1616734285113的数据列单元格。delete命令指定的时间戳值大于要删除的数据列单元格的时间戳将不会执行删除,小于或等于要删除的数据列单元格的时间戳将会执行删除。可执行scan 'students'命令确认是否删除成功。
delete命令不能对一整行数据进行删除,只能删除某行中的指定列。delete命令删除列可指定行键、列族和列限定符或指定行键、列族、列限定符和时间戳值。delete命令必须指定行键,但不能只指定行键来删除某一行的所有列,也不能只指定列族不指定行键来删除某列族的所有列。如果指定行键和列族但不指定列限定符,delete命令能执行但是不会报错也不会执行任何删除。
- 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
说明:删除students表的行键s001,列名info:name的所有数据列单元格,0 row(s)中的数字0表示删除命令执行成功。可执行scan 'students'命令确认是否删除成功。
用法格式3:deleteall 't1', 'r1', 'c1', ts
用法说明:删除表t1中行键为r1、列名为c1、时间戳小于等于ts的数据列单元格,其中t1是表名,r1是行键,c1是列名,ts代表时间戳值的范围。如果deleall命令带时间戳ts参数,就不能只指定行键也要指定列。
用法示例:删除数据表students的指定数据列单元格
在HBase Shell终端执行命令deleteall 'students', 's002', 'info:age', 1616851507964,输出结果如下:
0 row(s) in 0.0140 seconds
说明:删除students表的行键s002,列名info:age,时间戳值小于等于1616851507964的所有数据列单元格,0 row(s)中的数字0表示删除命令执行成功。可执行scan 'students'命令确认是否删除成功。如果只指定时间戳,不指定行键、列族和列限定符,deleteall 命令能执行但是不会报错也不会执行任何删除。
- append命令
append是给指定列的单元格值追加内容的操作命令。在HBase Shell终端输入append后HBase Shell会提示该命令的完整用法。
用法格式:append 't1', 'r1', 'c1', 'value'
用法说明:给数据表t1的行键为r1,列名为c1的单元格值追加内容value
用法举例:给数据表stuents的单元格值追加内容
在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。该数据列单元格的时间戳发生了变化,说明append命令是将原有的单元格值追加内容作为一个新值,再写入一个新的列单元格,并不是直接修改原有的单元格值。如果要追加写入的单元格不存在,执行append命令就相当于执行put命令。
- truncate命令
truncate命令会清空指定数据表的全部数据内容。该命令的实际执行过程是先禁用表,再清除表中的全部数据,但是该表的表属性和列族属性仍会保留。
用法格式:truncate 't1'
用法说明:清空表t1中的全部数据,保留该表的表属性和列族属性。
用法举例:清空数据表students
在HBase Shell终端执行命令truncate 'students',输出结果如下:
Truncating 'students' table (it may take a while):
- Disabling table...
- Truncating table...
0 row(s) in 3.4160 seconds
说明:提示正在truncate数据表,需要执行一段时间,先禁用表再清除表中的全部数据。
2.3 General分组的操作命令
general分组包含了对HBase的常规操作命令。
- status命令
status命令用于查看HBase集群状态,主要用法格式如下:
用法格式1:status或status 'summary'
用法格式2:status 'simple'
用法格式3:status 'detailed'
用法示例1:查看HBase集群状态的摘要信息
在HBase Shell终端执行status或status '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.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数,活跃的master节点名称,并详细列出所有数据表的运行状态详细参数。于HBase系统管理员和运维工程师可以通过该命令监控HBase集群的运行状态细节。
- 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,并显示该版本的发布日期。
- whoami命令
whoami命令用于查看当前登录HBase的系统用户信息。
用法示例:查看当前登录HBase的系统用户信息
在HBase Shell终端执行whoami命令,输出结果如下:
root (auth:SIMPLE)
groups: root
说明:当前HBase的登录用户账号是root,用户组名称是root,认证方式是简单认证。
- 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脚本语言的解释器。
3 HBase Shell命令行的高级操作命令
本节主要介绍HBase Shell命令行的各种高级操作命令的用法格式、用法说明和用法示例,应能熟练掌握HBase Shell命令行的高级操作命令。
3.1 namespace分组的高级操作命令
名字空间(Namespace)是HBase对数据表的逻辑分组,用于对数据表进行业务划分。例如上层应用可以将不同业务的数据表分别存放在不同的名字空间,以实现不同业务数据表之间的数据隔离。名字空间和数据表是一对多关系,名字空间可以包含多张数据表,一张数据表只能属于一个名字空间。名字空间对应了HBase表存储在HDFS上的一个子目录。HBase数据库中的NameSpace类似于MySQL数据库中database。
下面对NameSpace分组中的常用操作命令进行详细介绍:
- 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是用户自定义的名字空间。
- 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行,而是代表创建成功。
- 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不允许被删除。
- 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和default。hbase是系统命名空间,用于包含HBase内部表,meta和namespace都是hbase名字空间中的内部表;创建时未明确指定名字空间,则数据表将默认属于default 空间。
注意list_namespace_tables 'default'命令和list命令并不等效。list命令是同时列出default名字空间和用户自定义名字空间的数据表。
在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是默认名字空间default中的表。
- 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。
- 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
说明:0 row(s)表示命令执行成功。
在HBase Shell终端执行describe_namespace 'ns1'命令查看名字空间ns1的属性信息,终端输出结果如下:
DESCRIPTION
{NAME => 'ns1'}
1 row(s) in 0.0260 seconds
说明:名字空间ns1之前的属性PROPERTY_NAME已被删除。
3.2 snapshot分组的高级操作命令
HBase快照(SnapShot)用于对HBase数据表的某个时刻的数据和状态进行备份,可避免意外删除数据而导致数据丢失。HBase在运行过程中不断有数据写入和删除,在某时刻对数据表做快照,可以把该时刻数据表的数据和状态固化下来,有点类似Virtual Box等虚拟机软件的快照恢复功能。HBase快照机制可在HBase集群运行过程中对数据表进行热备份,然后可以再通过快照进行数据恢复。HBase快照的备份过程无需拷贝任何数据,只是增加了当前表的所有HFiles文件的新指针,因此对当前集群的读写性能没有任何影响。
- snapshot命令
snapshot命令用于对指定的数据表做快照。
用法格式1:snapshot 'sourceTable', 'snapshotName'
用法说明:为default名字空间的sourceTable表创建名字为snapshotName的快照
用法格式2:snapshot 'namespace:sourceTable', 'snapshotName', {SKIP_FLUSH => true}
用法说明:为namespace名字空间的sourceTable表创建名字为snapshotName的快照,且做快照时跳过flush操作。
用法示例1:给数据表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)表示命令执行成功。
- 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。
- 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生成快照时的数据相同。执行desc 'students_clone'命令查看克隆表的属性,和原表students生成快照时的属性相同。
- restore_snapshot命令
restore_snapshot是快照恢复命令,将原数据表的数据内容恢复到做快照时的状态。
用法格式:restore_snapshot 'snapshotName'
用法说明:利用快照snapshotName,将快照所属原数据表内容恢复到做快照时的状态、属性和数据。
用法示例:利用快照恢复原有数据表
在HBase Shell终端依次执行以下命令:
1)执行disable 'restore_snapshot是快照恢复命令'命令禁用要进行快照恢复的表;
2)执行快照恢复命令restore_snapshot 'snapshot_students'恢复原数据表;
3)执行enable 'students'命令启用已恢复的表;
4)执行scan 'students'命令和desc 'students'命令确认表数据和属性已全部恢复。
在HBase Shell终端执行以上命令的部分输出结果如下:
hbase(main):004:0> truncate 'students'
Truncating 'students' table (it may take a while):
- Disabling table...
- Truncating table...
0 row(s) in 4.2150 seconds
hbase(main):005:0> scan 'students'
ROW COLUMN+CELL
0 row(s) in 0.3900 seconds
hbase(main):006:0> disable 'students'
0 row(s) in 2.3810 seconds
hbase(main):007:0> restore_snapshot 'snapshot_students'
0 row(s) in 0.9720 seconds
hbase(main):008:0> enable 'students'
0 row(s) in 1.3660 seconds
hbase(main):009:0> scan ‘students’
ROW COLUMN+CELL
s001 column=info:age, timestamp=1618653390083, value=18
... ...
一个快照只会对应唯一的一张数据表,因此执行restore_snapshot命令只需指定一个参数快照名称,而无需指定要进行快照恢复的数据表名称。HBase不允许对正在运行中的数据表执行快照恢复,因此对数据表执行快照恢复之前必须先禁用该表。
快照克隆可用于HBase数据库运维和数据恢复。假如数据表的数据丢失或损坏,快照克隆可使数据表恢复到某个数据状态正确的历史时刻,但仍可能会存在部分业务数据的丢失。利用快照恢复原数据表,数据表中现有的数据将会被重置,恢复到做快照时的状态和数据,因此在生产环境执行快照恢复命令需谨慎。
- delete_snapshot命令
delete_snapshot是删除快照命令,删除指定名称的某个快照。
用法格式:delete_snapshot 'snapshotName'
用法说明:删除名称为snapshotName的快照。
用法示例:删除名称为snapshot_students的作快照
在HBase Shell终端执行命令delete_snapshot 'snapshot_students',终端输出结果如下:
0 row(s) in 0.0230 seconds
在HBase Shell终端执行命令list_snapshots查看快照,发现该快照已被删除。
- delete_all_snapshot命令
delete_all_snapshot是删除多个快照的命令,会删除符合条件的所有快照。
用法格式:delete_all_snapshot 's.*'
用法说明:删除快照名称的前缀为's'的所有快照,'s.*'代表正则表达式前缀。
用法示例:删除快照名称的前缀为's'的所有快照
在HBase Shell终端执行命令delete_all_snapshot 's.*',终端输出结果如下:
SNAPSHOT TABLE + CREATION TIME
snapshot_students students (Tue Mar 22 09:40:07 +0800 2022)
snapshot_students_1 students (Tue Mar 22 09:46:01 +0800 2022)
snapshot_students_2 students (Tue Mar 22 09:48:46 +0800 2022)
Delete the above 3 snapshots (y/n)?
y
0 row(s) in 0.0780 seconds
3 snapshots successfully deleted.
说明:根据提示输入y将会删除符合前缀条件的所有快照。
3.3 tools分组的高级操作命令
toos分组中有很多HBase工具类高级操作命令,其中包含对Region的操作管理命令。
- 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的数据行。第1个Region的End Key和第2个Region的Start Key都等于拆分行键s003。
- merge_region命令
merge_region命令是Region合并命令,用于对指定的Region进行合并。
用法格式:merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME'
用法说明:根据指定Region编码值对两个Region进行合并
用法举例:合并students表的两个Region,可在HBase自带web页面的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。
- 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
说明:在有多个RegionServer的HBase分布式集群执行move命令,才能看到Region的实际移动效果。可登录HBase自带web页面查看数据表的分区情况。
4使用过滤器进行HBase读数据操作
4.1 八种常用的HBase过滤器
HBase过滤器种类很多,我们选择8种常用的过滤器进行详细介绍。为了更好的示例效
果,先利用HBase Shell脚本文件在students表中写入多行数据:
1.在HBase Shell终端执行命令truncate 'students',清空students表中的全部数据
2.在Linux Shell终端执行vi students_data,写入下列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
quit
3.在Linux Shell终端执行hbase shell students_data命令,向HBase的students表中自动
批量写入数据,执行完成后可在HBase Shell终端执行scan ‘students’命令查看写入结果。
- 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’进行子串匹配,。
- 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是二进制按位比较。
用法示例:在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做比较。
- 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'作比较。
- 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’的所有数据列。
- 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命令必须指定唯一确定完整的行键,没有必要再对行键前缀进行过滤。
- 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'。
- 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的单元格值存储为字符数组,但是在以子字符串匹配方式进行单元格值过滤时,会把单元格值转换为字符串再进行子串匹配。
用法示例1:在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的数据列。
用法示例2:在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',不仅会把符合过滤条件的s004行的数据列score:English筛选出来,也会把s004行的其他数据列也筛选出来,而且会把其他不包含数据列score:English的数据行都筛选出来。s002,s003和s005行都不包含数据列score:English,所以被筛选出来。s001行包含score:English数据列,但是列值不满足过滤条件,因此没有被筛选出来。
- 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
说明:筛选出时间戳版本值包含在指定时间戳列表中的数据列。
- 多种过滤器的组合用法
执行scan命令可以使用多种过滤器的组合以筛选出符合多种过滤条件的结果。在HBase Shell终端只输入scan命令得到命令用法提示中包含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的数据列。
5 一个HBase Shell的应用案例
电商(eshop)平台具有海量数据、高并发访问、高速读写等特征,适合使用HBase分布式数据库进行数据存储。本节通过一个HBase在电商平台的应用案例,帮助读者熟练掌握并综合运用HBase Shell命令行终端提供的各种操作命令。
5.1 电商(eshop)平台的逻辑数据模型
在HBase创建一个自定义名字空间eshop,用于存放电商平台的用户表shopping(客户商品订单表)。用户表shopping包括customer、order和item共三个列族,用逻辑数据模型来表示表中存放的数据。如表7-9所示:
表7-9用逻辑数据模型表示电商系统用户表shopping中存放的数据
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 | 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 | 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 | 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 | 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 | price | $20000.00 |
00000000005-Lily | preference | handbag | pay-state | payed | ||
00000000005-Lily | level | VIP | post-state | delivered | ||
00000000005-Lily | | abc@qq.com |
5.2 使用HBase Shell操作电商平台数据
- 对电商平台数据执行简单读写操作
进入HBase Shell终端环境,执行HBase Shell命令完成以下对电商平台数据的操作:
1)创建一个名称为eshop的名字空间,并列出HBase系统所有的名字空间。
操作命令:create_namespace 'eshop'
list_namespace
2)在eshop名字空间中创建表名为shopping的用户表,包含1个列族customer;再列出HBase的所有数据表。
操作命令:create 'eshop:shopping', 'customer'
list
3)给eshop名字空间中的shopping表增加两个新的列族order和item
操作命令:alter 'eshop:shopping', 'order', 'item'
4)先删除shopping表后再重新创建shopping表,包含3个列族customer,order和item
操作命令:disable 'eshop:shopping'
is_disabled 'eshop:shopping'
drop 'eshop:shopping'
create 'eshop:shopping', 'customer', 'order', 'item'
5)修改shopping表的表级别属性,将文件大小最大值修改为134217728字节
操作命令:alter 'eshop:shopping', MAX_FILESIZE=>134217728
6)描述shopping表的列族属性信息
操作命令:desc 'eshop:shopping'
7)将用户表shopping逻辑数据模型中的所有数据写入到shooping表中
操作命令:put 'eshop:shopping', '00000000001-Jack', 'customer:name', 'Jack'
put 'eshop:shopping', '00000000001-Jack', 'customer:phone', '00000000001'
put 'eshop:shopping', '00000000001-Jack', 'customer:address', 'Wu Han'
put 'eshop:shopping', '00000000001-Jack', 'customer:level', 'normal'
... ...
put 'eshop:shopping', '00000000005-Lily', order:post-state', 'delivered'
put 'eshop:shopping', '00000000005-Lily', 'customer:email', 'abc@qq.com'
8)对shopping表进行全表扫描(读取所有数据行的所有数据列单元格)
操作命令:scan 'eshop:shopping'
9)读取shopping表的行键为00000000004-Lucy的所有数据列的单元格值
操作命令:get 'eshop:shopping', '00000000004-Lucy'
10)读取shopping表的行键为00000000005-Lily,列族为customer,列限定符为preference的数据列的单元格值
操作命令:get 'eshop:shopping', '00000000005-Lily', 'customer:preference'
- 对电商平台数据执行复杂读写操作
进入HBase Shell终端环境,执行HBase Shell命令完成以下对电商平台数据的操作:
1)修改shopping表的列族属性,将列族order的列族属性VERSIONS修改为3
操作命令:alter 'eshop:shopping', NAME => 'order', VERSIONS => 3
2)修改shopping表的列族属性,将列族order的列族属性TTL生存时间修改为1周,压缩模式修改为gz
操作命令:alter 'students', NAME => 'info, TTL => 60 * 60 * 24* 7, COMPRESSION => 'gz'
3)将shopping表的行键为00000000001-Jack,列族为order,列限定符为number的数据列的单元格值依次修改为2和3
操作命令:put 'eshop:shopping', '00000000001-Jack', 'order:number', 2
put 'eshop:shopping', '00000000001-Jack', 'order:number', 3
4)读取shopping表客户Jack的订单中商品数量的最近3次的版本值
操作命令:get 'eshop:shopping','00000000001-Jack',{COLUMN=> 'order:number', VERSIONS => 3}
5)对shopping表指定行键范围00000000002-Tom到00000000004-Lucy的数据行进行扫描,扫描结果包括第00000000002-Tom行,也包括第00000000004-Lucy行
操作命令:scan 'eshop:shopping', { STARTROW => '00000000002-Tom', STOPROW =>'00000000005-Lily'}
6)对shopping表的列族customer中的所有数据列进行扫描
操作命令:scan 'eshop:shopping', {COLUMNS => 'customer'}
7)对shopping表的列族customer中列名为phone的所有数据列进行扫描
操作命令:scan 'eshop:shopping', {COLUMNS => 'customer:phone'}
8)对shopping表的前3行数据进行扫描
操作命令:scan 'eshop:shopping', {LIMIT => 3}
9)统计shopping表中的数据行数
操作命令:count 'eshop:shopping'
10)删除shopping表的行键为00000000005-Lily,列族为customer,列限定符为email的数据列
操作命令:delete 'eshop:shopping', '00000000005-Lily', 'customer:email'
- 对电商平台数据执行其他高级操作
进入HBase Shell终端环境,执行HBase Shell命令完成以下对电商平台数据的操作:
1)对shopping表的行键为00000000003-Mike,列族为item,列限定符为item_name的数据列单元格值追加内容Ultra
操作命令:append 'eshop:shopping', '00000000003-Mike', 'item:item_name', 'Ultra'
2)查看HBase集群状态的详细信息,并查看HBase的当前软件版本
操作命令:status 'detailed' 和version
3)创建一个新的名字空间new_ns,并列出HBase当前所有的名字空间
操作命令:
create_namespace 'new_ns' 和 list_namespace
4)删除名称为new_ns的名字空间
操作命令:drop_namespace 'new_ns'
5)给默认名字空间default增加一个属性名user,属性值root
操作命令:alter_namespace 'default', {METHOD => 'set', 'user' => 'root'}
6)描述默认名字空间default的属性信息
操作命令:describe_namespace 'default'
7)列出系统名字空间hbase中包含的所有数据表
操作命令:list_namespace_tables 'hbase'
8)给自定义名字空间eshop中的shopping表创建快照snapshot_eshop_shopping
操作命令:snapshot 'eshop:shopping', snapshot_eshop_shopping'
9)查看当前HBase系统中所有的快照
操作命令:list_snapshots
10)利用快照snapshot_eshop_shopping在eshop名字空间克隆出一张新的数据表shopping_clone
操作命令:clone_snapshot 'snapshot_eshop_shopping, 'eshop:shopping_clone'
- 对电商平台数据执行带过滤器的读数据操作
进入HBase Shell终端环境,执行HBase Shell命令完成以下对电商平台数据的操作:
1)清空eshop:shopping表中全部数据,恢复到快照snapshot_eshop_shopping时的状态
操作命令:truncate 'eshop:shopping' 清除students表中的全部数据
scan 'eshop:shopping' 确认表数据已全部清除
isable 'eshop:shopping' 禁用要进行快照恢复的表
restore_snapshot 'snapshot_eshop_shopping快照恢复命令恢复原数据表
enable 'eshop:shopping' 启用已恢复的表
scan 'eshop:shopping' 确认表数据已全部恢复
2)执行scan命令,使用ValueFilter过滤器筛选出eshop:shopping表中单元格值等于Wu Han的所有数据
操作命令:scan 'eshop:shopping',{ FILTER => "ValueFilter(=, 'binary:Wu Han')" }
3)执行scan命令,使用QualifierFilter过滤器筛选出eshop:shopping表中列名(qualifier)包含子字符串re的所有数据
操作命令:scan 'eshop:shopping', { FILTER => "QualifierFilter(=,'substring:re')"}
4)执行scan命令,使用ColumnPrefixFilter过滤器筛选出eshop:shopping表中列名(qualifier)前缀为date的所有数据
操作命令:scan 'eshop:shopping', { FILTER => "ColumnPrefixFilter('date')"}
5)执行scan命令,使用RowFilter过滤器筛选出eshop:shopping表中行键(row key)包含子字符串-L的所有数据
操作命令:scan 'eshop:shopping', { FILTER => "RowFilter(=, 'substring:-L')"}
6)执行scan命令,使用PrefixFilter过滤器筛选出eshop:shopping表中行键(row key)前缀为00000000001的所有数据
操作命令:scan 'eshop:shopping', { FILTER => "PrefixFilter('00000000001')"}
7)执行scan命令,使用FamilyFilter过滤器筛选出eshop:shopping表中列族(column family)名称包含子字符串er的所有数据列
操作命令:scan 'eshop:shopping', FILTER => "FamilyFilter(=, 'substring:er')"
8)执行scan命令,使用SingleColumnValueFilter过滤器筛选出订单商品表shopping中客户爱好包含子字符串c的所有数据
操作命令:scan 'eshop:shopping'{FILTER => "SingleColumnValueFilter('customer', 'preference', =, 'substring:c')"}
9)将eshop:shopping表从行键值为00000000003-Mike的位置进行Region的拆分,并执行get_splits命令查看eshop:shopping表的Region拆分结果
操作命令:split 'eshop:shopping', '00000000003-Mike'
get_splits 'eshop:shopping'
10)对eshop:shopping表已拆分的两个Region重新进行合并
操作命令:
scan 'hbase:meta'
查询元数据表获取两个Region经过编码的名称ENCODED_REGIONNAME1和ENCODED_REGIONNAME2
merge_region 'ENCODED_REGIONNAME1', 'ENCODED_REGIONNAME2' 执行两个Region的合并