仰天大笑出门去,我辈岂是蓬蒿人。这篇文章主要讲述HBase Shell及其常用命令相关的知识,希望能为你提供帮助。
HBase Shell及其常用命令HBase 数据库默认的客户端程序是 HBase Shell,它是一个命令行工具。用户可以使用 HBase Shell,通过命令行的方式与 HBase 进行交互。
HBase Shell 是一个封装了 java 客户端 API 的 JRuby 应用软件,在 HBase 的 HMaster 主机上通过命令行输入 hbase shell,即可进入 HBase 命令行环境,如图 1 所示。
文章图片
图 1:HBase Shell 命令行环境
在 Shell 中输入help可以获取可用命令列表,输入help commandname可获取特定命令的帮助,还可以输入各种命令查看集群、数据库和数据的各项详情。
例如,使用status命令查看当前集群各节点的状态,使用version命令查看当前 HBase 的版本号,输入命令exit或quit即可退出 HBase Shell。
下面对常用命令做一下汇总。
HBase Shell 数据表命令 |
|
命令 |
描述 |
create |
创建指定模式的新表 |
alter |
修改表的结构,如添加新的列族 |
describe |
展示表结构的信息,包括列族的数量与属性 |
list |
列出 HBase 中已有的表 |
disable/enable |
为了删除或更改表而禁用一个表,更改完后需要解禁表 |
disable_all |
禁用所有的表,可以用正则表达式匹配表 |
is_disable |
判断一个表是否被禁用 |
drop |
删除表 |
truncate |
如果只是想删除数据而不是表结构,则可用 truncate 来禁用表、删除表并自动重建表结构 |
HBase Shell 增删改查命令 |
|
命令 |
描述 |
put |
添加一个值到指定单元格中 |
get |
通过表名、行键等参数获取行或单元格数据 |
scan |
遍历表并输出满足指定条件的行记录 |
count |
计算表中的逻辑行数 |
delete |
删除表中列族或列的数据 |
HBase创建表(create命令)与关系型数据库不同,在 HBase 中,基本组成为表,不存在多个数据库。因此,在 HBase 中存储数据先要创建表,创建表的同时需要设置列族的数量和属性。
示例:Student 数据表 |
||||||||
行键 |
列族 StuInfo |
列族 Grades |
时间戳 |
|||||
Name |
Age |
Sex |
Class |
BigData |
Computer |
Math |
||
0001 |
Tom Green |
18 |
Male |
80 |
90 |
85 |
T2 |
|
0002 |
Amy |
19 |
01 |
95 |
89 |
T1 |
||
0003 |
Allen |
19 |
Male |
02 |
90 |
88 |
T1 |
HBase 使用 creat 命令来创建表,创建表时需要指明表名和列族名,如创建上表中的学生信息表 Student 的命令如下:
create \'Student\',\'StuInfo\',\'Grades\'
这条命令仓建了名为 Student 的表,表中包含两个列族,分别为 Stulnfo 和 Grades。
注意在 HBase Shell 语法中,所有字符串参数都必须包含在单引号中,且区分大小写,如 Student 和 student 代表两个不同的表。
另外,在上条命令中没有对列族参数进行定义,因此使用的都是默认参数,如果建表时要设置列族的参数,参考以下方式:
create \'Student\', {NAME => \'Stulnfo\', VERSIONS => 3}, {NAME => \'Grades\', BLOCKCACHE => true}
大括号内是对列族的定义,NAME、VERSION 和 BLOCKCACHE 是参数名,无须使用单引号,符号=> 表示将后面的值赋给指定参数。例如,VERSIONS => 3是指此单元格内的数据可以保留最近的 3 个版本,BLOCKCACHE => true指允许读取数据时进行缓存。
创建表结构以后,可以使用 exsits 命令查看此表是否存在,或使用 list 命令查看数据库中所有表,如下图所示。
文章图片
图 2:exsits 和 list 命令
还可以使用 describe 命令查看指定表的列族信息,如下图所示。
文章图片
图 3:describe 命令
describe 命令描述了表的详细结构,包括有多少个列族、每个列族的参数信息,这些显示的参数都可以使用 alter 命令进行修改。
Student表完整语句 create \'Student\',{NAME=> \'StuInfo\',VERSIONS=> \'3\'},\'Grades\' put \'Student\', \'0001\', \'StuInfo:Name\', \'Tom Green\', 1 put \'Student\', \'0001\', \'StuInfo:Age\', \'18\' put \'Student\', \'0001\', \'StuInfo:Sex\', \'Male\' put \'Student\', \'0001\', \'Grades:BigData\', \'80\' put \'Student\', \'0001\', \'Grades:Computer\', \'90\' put \'Student\', \'0001\', \'Grades:Math\', \'85\' put \'Student\', \'0002\', \'StuInfo:Name\', \'Amy\' put \'Student\', \'0002\', \'StuInfo:Age\', \'19\' put \'Student\', \'0002\', \'Grades:BigData\', \'95\' put \'Student\', \'0002\', \'Grades:Math\', \'89\' put \'Student\', \'0003\', \'StuInfo:Name\', \'Allen\' put \'Student\', \'0003\', \'StuInfo:Age\', \'19\' put \'Student\', \'0003\', \'StuInfo:Sex\', \'Male\' put \'Student\', \'0003\', \'StuInfo:Class\', \'02\' put \'Student\', \'0003\', \'Grades:BigData\', \'90\' put \'Student\', \'0003\', \'Grades:Math\', \'88\' |
HBase修改表(alter命令)HBase 表的结构和表的管理可以通过 alter 命令来完成,使用这个命令可以完成更改列族参数信息、增加列族、删除列族以及更改表的相关设置等操作。
示例:Student 数据表 |
||||||||
行键 |
列族 StuInfo |
列族 Grades |
时间戳 |
|||||
Name |
Age |
Sex |
Class |
BigData |
Computer |
Math |
||
0001 |
Tom Green |
18 |
Male |
80 |
90 |
85 |
T2 |
|
0002 |
Amy |
19 |
01 |
95 |
89 |
T1 |
||
0003 |
Allen |
19 |
Male |
02 |
90 |
88 |
T1 |
首先修改列族的参数信息,如修改列族的版本。例如上面的 Student 表,假设它的列族 Grades 的 VERSIONS 为 1,但是实际可能需要保存最近的 3 个版本,可使用以下命令完成:
alter \'Student\', {NAME => \'Grades\', VERSIONS => 3}
修改多个列族的参数,形式与 create 命令类似。
这里要注意,修改已存有数据的列族属性时,HBase 需要对列族里所有的数据进行修改,如果数据量很大,则修改可能要占很长时间。
增加列族
如果需要在 Student 表中新增一个列族 hobby,使用以下命令:
alter \'Student\', \'hobby\'
删除列族
如果要移除或者删除已有的列族,以下两条命令均可完成:
alter \'Student\', { NAME => \'hobby\', METHOD => \'delete\' }
alter \'Student\', \'delete\' => \'hobby\'
另外,HBase 表至少要包含一个列族,因此当表中只有一个列族时,无法将其删除。
HBase删除表(disable和drop命令)HBase 使用 drop 命令删除表,但是在删除表之前需要先使用 disable 命令禁用表。
例如有一个 Student 表,删除该表的完整流程如下:
disable \'Student\'
drop \'Student\'
使用 disable 禁用表以后,可以使用 is_disable 查看表是否禁用成功。
另外,如果只是想清空表中的所有数据,使用 truncate 命令即可,此命令相当于完成禁用表、删除表,并按原结构重新建立表操作:
truncate \'Student\'
HBase put命令:插入数据HBase 使用 put 命令向数据表中插入数据,put 向表中增加一个新行数据,或覆盖指定行的数据。
示例:Student 数据表 |
||||||||
行键 |
列族 StuInfo |
列族 Grades |
时间戳 |
|||||
Name |
Age |
Sex |
Class |
BigData |
Computer |
Math |
||
0001 |
Tom Green |
18 |
Male |
80 |
90 |
85 |
T2 |
|
0002 |
Amy |
19 |
01 |
95 |
89 |
T1 |
||
0003 |
Allen |
19 |
Male |
02 |
90 |
88 |
T1 |
例如有以上结构的数据表,向其中插入一条数据的写法为:
put \'Student\', \'0001\', \'Stulnfo:Name\', \'Tom Green\', 1
在上述命令中:
- 第一个参数Student为表名;
- 第二个参数0001为行键的名称,为字符串类型;
- 第三个参数StuInfo:Name为列族和列的名称,中间用冒号隔开。列族名必须是已经创建的,否则 HBase 会报错;列名是临时定义的,因此列族里的列是可以随意扩展的;
- 第四个参数Tom Green为单元格的值。在 HBase 里,所有数据都是字符串的形式;
- 最后一个参数1为时间戳,如果不设置时间戳,则系统会自动插入当前时间为时间戳。
注意,put 命令只能插入一个单元格的数据,上表中的一行数据需要通过以下几条命令一起完成:
put \'Student\', \'0001\', \'StuInfo:Name\', \'Tom Green\', 1
put \'Student\', \'0001\', \'StuInfo:Age\', \'18\'
put \'Student\', \'0001\', \'StuInfo:Sex\', \'Male\'
put \'Student\', \'0001\', \'Grades:BigData\', \'80\'
put \'Student\', \'0001\', \'Grades:Computer\', \'90\'
put \'Student\', \'0001\', \'Grades:Math\', \'85\'
如果 put 语句中的单元格是已经存在的,即行键、列族及列名都已经存在,且不考虑时间戳的情况下,执行 put 语句,则可对数据进行更新操作。
如以下命令可将行键为 0001 的学生姓名改为 Jim Green:
put \'Student\', \'0001\', \'Stulnfo:Name\', \'Jim Green\'
如果在初始创建表时,已经设定了列族 VERSIONS 参数值为 n,则 put 操作可以保存 n 个版本数据,即可查询到行键为 0001 的学生的 n 个版本的姓名数据。
HBase删除数据(delete命令)HBase delete 命令可以从表中删除一个单元格或一个行集,语法与 put 类似,必须指明表名和列族名称,而列名和时间戳是可选的。
示例:Student 数据表 |
||||||||
行键 |
列族 StuInfo |
列族 Grades |
时间戳 |
|||||
Name |
Age |
Sex |
Class |
BigData |
Computer |
Math |
||
0001 |
Tom Green |
18 |
Male |
80 |
90 |
85 |
T2 |
|
0002 |
Amy |
19 |
01 |
95 |
89 |
T1 |
||
0003 |
Allen |
19 |
Male |
02 |
90 |
88 |
T1 |
例如,执行以下命令,将删除 Student 表中行键为 0002 的 Grades 列族的所有数据:
delete \'Student\', \'0002\', \'Grades\'
需要注意的是,delete 操作并不会马上删除数据,只会将对应的数据打上删除标记(tombstone),只有在合并数据时,数据才会被删除。
另外,delete 命令的最小粒度是单元格(Cell)。例如,执行以下命令将删除 Student 表中行键为 0001,Grades 列族成员为 Math,时间戳小于等于 2 的数据:
delete \'Student\', \'0001\', \'Grades:Math\', 2
delete 命令不能跨列族操作,如需删除表中所有列族在某一行上的数据,即删除上表中一个逻辑行,则需要使用 deleteall 命令,如下所示,不需要指定列族和列的名称:
deleteall \'Student\', \'0001\'
HBase get命令:从表中获取数据HBase get 命令可以从数据表中获取某一行记录,类似于关系型数据库中的 select 操作。get 命令必须设置表名和行键名,同时可以选择指明列族名称、时间戳范围、数据版本等参数。
示例:Student 数据表 |
||||||||
行键 |
列族 StuInfo |
列族 Grades |
时间戳 |
|||||
Name |
Age |
Sex |
Class |
BigData |
Computer |
Math |
||
0001 |
Tom Green |
18 |
Male |
80 |
90 |
85 |
T2 |
|
0002 |
Amy |
19 |
01 |
95 |
89 |
T1 |
||
0003 |
Allen |
19 |
Male |
02 |
90 |
88 |
T1 |
例如,对于上面的数据表,执行以下命令可以获取 Student 表中行键为 0001 的所有列族数据:
get \'Student\', \'0001\'
下图展示了在 get 语句中使用限定词 VERSIONS 后获取的数据内容。
文章图片
上图中首先 put 三条数据,因为初始创建 Student 表和 Stulnfo 列族时,已经设定 VERSIONS 为 3,即使用 get 获取数据时最多得到 3 个版本的数据。
文章图片
上图中的 get 命令使用了限定词 VERSIONS=> 2,因此 get 得到的数据只显示了 Stulnfo:Name 最小的两个版本。
HBase scan命令:查询全表数据HBase scan 命令用来查询全表数据,使用时只需指定表名即可。
示例:Student 数据表 |
||||||||
行键 |
列族 StuInfo |
列族 Grades |
时间戳 |
|||||
Name |
Age |
Sex |
Class |
BigData |
Computer |
Math |
||
0001 |
Tom Green |
18 |
Male |
80 |
90 |
85 |
T2 |
|
0002 |
Amy |
19 |
01 |
95 |
89 |
T1 |
||
0003 |
Allen |
19 |
Male |
02 |
90 |
88 |
T1 |
例如对于上面的 Student 表,使用下面的写法即可查询数据:
scan \'Student\'
同样地,还可以指定列族和列的名称,或指定输出行数,甚至指定输出行键范围,如下图所示。
文章图片
scan 指定条件输出时,需要使用大括号将参数包含起来。
注意指定列族和列名称使用 COLUMN 限定符;指定输出行键范围使用 STARTROW 和 ENDROW 限定符,此时输出行不包括 ENDROW 行。例如,上图中 ENDROW=> 0003,只会输出行键为 0002 的记录,不会输出 0003 记录。
HBase还支持LIMIT(限制查询结果行数),STARTROW(ROWKEY起始行。会先根据这个key定位到region,再向后扫描)、STOPROW/ENDROW(结束行)、TIMERANGE(限定时间戳范围)、VERSIONS(版本数)、和FILTER(按条件过滤行)等。上述限定条件也可以联合使用,中间用逗号隔开即可。
在 HBase 中,具有相同行键的单元格,无论其属于哪个列族,都可以将整体看作一个逻辑行, 使用 count 命令可以计算表的逻辑行数。
文章图片
在关系型数据库中,有多少条记录就有多少行,表中的行数很容易统计。而在 HBase 里,计算逻辑行需要扫描全表的内容,重复的行键是不纳入计数的,且标记为 tombstone 的删除数据也不纳入计数。
执行 count 命令其实是一个开销较大的进程,特别是应用在大数据场景时,可能需要持续很长时间,因此,用户一般会结合 Hadoop 的 MapReduce 架构来进行分布式的扫描计数。
HBase过滤器入门Filter在 HBase 中,get 和 scan 操作都可以使用过滤器来设置输出的范围,类似 SQL 里的 Where 查询条件。
使用 show_filter 命令可以查看当前 HBase 支持的过滤器类型,如下图所示。
文章图片
使用上述过滤器时,一般需要配合比较运算符或比较器使用,如下面两个表所示。
比较运算符 |
|
比较运算符 |
描述 |
= |
等于 |
>
|
大于 |
>
= |
大于等于 |
<
|
小于 |
<
= |
小于等于 |
!= |
【HBase Shell及其常用命令】不等于 |
比较器 |
|
比较器 |
描述 |
BinaryComparator |
匹配完整字节数组 |
BinaryPrefixComparator |
匹配字节数组前缀 |
BitComparator |
匹配比特位 |
NullComparator |
匹配空值 |
RegexStringComparator |
匹配正则表达式 |
SubstringComparator |
匹配子字符串 |
scan \'表名\', { Filter => "过滤器(比较运算符, \'比较器\') }
在上述语法中,Filter=> 指明过滤的方法,整体可用大括号引用,也可以不用大括号。过滤的方法用双引号引用,而比较方式用小括号引用。
下面介绍常见的过滤器使用方法。
行键过滤器
RowFilter 可以配合比较器和运算符,实现行键字符串的比较和过滤。例如,匹配行键中大于 0001 的数据,可使用 binary 比较器;匹配以 0001 开头的行键,可使用 substring 比较器,注意 substring 不支持大于或小于运算符。
实现上述匹配条件的过滤命令以及显示结果如下图所示。
文章图片
针对行键进行匹配的过滤器还有 PrefixFilter、KeyOnlyFilter、FirstKeyOnlyFilter 和 InclusiveStopFilter,其具体含义和使用示例如下表所示。
其中,FirstKeyOnlyFilter 过滤器可以用来实现对逻辑行进行计数的功能,并且比其他计数方式效率高。
其他行键过滤器描述 |
||
行键过滤器 |
描述 |
示例 |
PrefixFilter |
行键前缀比较器,比较行键前缀 |
scan \'Student\', FILTER =>
"PrefixFilter(\'0001\')" 同 scan \'Student\', FILTER => "RowFilter(=,\'substring:0001\')" |
KeyOnlyFilter |
只对单元格的键进行过滤和显示,不显示值 |
scan \'Student\', FILTER =>
"KeyOnlyFilter()" |
FirstKeyOnlyFilter |
只扫描显示相同键的第一个单元格,其键值对会显示出来 |
scan \'Student\', FILTER =>
"FirstKeyOnlyFilter()" |
InclusiveStopFilter |
替代 ENDROW 返回终止条件行 |
scan \'Student\', { STARTROW =>
\'0001\', FIILTER =>
"InclusiveStopFilter(\'binary:0002\')" } 同 scan \'Student\', { STARTROW => \'0001\', ENDROW => \'0003\' } |
上表中的命令示例操作结果如下图所示。
文章图片
列族与列过滤器
针对列族进行过滤的过滤器为 FamilyFilter,其语法结构与 RowFilter 类似,不同之处在于 FamilyFilter 是对列族名称进行过滤的。
例如,以下命令扫描Student表显示列族为 Grades 的行。
scan \'Student\', FILTER=> " FamilyFilter(= , \'substring:Grades\')"
针对列的过滤器如下表所示,这些过滤器也需要结合比较运算符和比较器进行列族或列的扫描过滤。
列过滤器描述 |
||
列过滤器 |
描述 |
示例 |
QualifierFilter |
列标识过滤器,只显示对应列名的数据 |
scan \'Student\', FILTER =>
"QualifierFilter(=,\'substring:Math\')" |
ColumnPrefixFilter |
对列名称的前缀进行过滤 |
scan \'Student\', FILTER =>
"ColumnPrefixFilter(\'Ma\')" |
MultipleColumnPrefixFilter |
可以指定多个前缀对列名称过滤 |
scan \'Student\', FILTER =>
"MultipleColumnPrefixFilter(\'Ma\',\'Ag\')" |
ColumnRangeFilter |
过滤列名称的范围 |
scan \'Student\', FILTER =>
"ColumnRangeFilter(\'Big\',true,\'Math\',false\')" |
MultipleColumnPrefixFilter 过滤器是对 ColumnPrefixFilter 的延伸,可以一次过滤多个列前缀。
ColumnRangeFilter过滤器则可以扫描出符合过滤条件的列范围,起始和终止列名用单引号引用,true 和 false 参数可指明结果中包含的起始或终止列。
上表中的过滤器示例在 HBase Shell 中扫描结果如下图所示。
文章图片
值过滤器
在 HBase 的过滤器中也有针对单元格进行扫描的过滤器,即值过滤器,如下表所示。
值过滤器描述 |
||
值过滤器 |
描述 |
示例 |
ValueFilter |
值过滤器,找到符合值条件的键值对 |
scan \'Student\', FILTER =>
"ValueFilter(=,\'substring:curry\')" 同 get \'Student\', \'0001\', FILTER => "ValueFilter(=,\'substring:curry\')" |
SingleColumnValueFilter |
在指定的列族和列中进行比较的值过滤器 |
scan \'Student\', Filter =>
"SingleColumnValueFilter(\'StuInfo\', \'Name\', =, \'binary:curry\')" |
SingleColumnValueExcludeFilter |
排除匹配成功的值 |
scan \'Student\', Filter =>
"SingleColumnValueExcludeFilter(\'StuInfo\', \'Name\', =, \'binary:curry\')" |
SingleColumnValueFilter 和 SingleColumnValueExcludeFilter 过滤器扫描的结果是相反的, 都需要在过滤条件中指定列族和列的名称。
上表中的值过滤器示例在 HBase Shell 中扫描结果如下图所示。
文章图片
其他过滤器
还有一些其他的过滤器,其过滤方式和示例如下表所示。
其他过滤器描述 |
||
值过滤器 |
描述 |
示例 |
ColumnCountGetFilter |
限制每个逻辑行返回键值对的个数,在 get 方法中使用 |
get \'Student\', \'0001\', FILTER =>
"ColumnCountGetFilter(3)" |
TimestampsFilter |
时间戳过滤,支持等值,可以设置多个时间戳 |
scan \'Student\', Filter =>
"TimestampsFilter(1,4)" |
InclusiveStopFilter |
设置停止行 |
scan \'Student\', { STARTROW =>
\'0001\', ENDROW =>
\'0005\', FILTER =>
"InclusiveStopFilter(\'0003\')" } |
PageFilter |
对显示结果按行进行分页显示 |
scan \'Student\', { STARTROW =>
\'0001\', ENDROW =>
\'0005\', FILTER =>
"PageFilter(3)" } |
ColumnPaginationFilter |
对一行的所有列分页,只返回 [offset,offset+limit] 范围内的列 |
scan \'Student\', { STARTROW =>
\'0001\', ENDROW =>
\'0005\', FILTER =>
"ColumnPaginationFilter(2,1)" } |
InclusiveStopFilter过滤器设置停止行,且包含停止的行,上表中示例最终展示数据为行键 0001?0003 范围内的数据。PageFilter 设置每页最多显示多少逻辑行, 示例中显示三个逻辑行。
ColumnPaginationFilter过滤器对一个逻辑行的所有列进行分页显示。
小问题:
在hbase shell中如果命令输入错误,很难退出。查了网上一个非百分百有效的方法是输入> \'然后回车。测试部分情况下有效果,但有时也无效,只能ctrl+c退出客户端。如果有哪位同学有好办法请在评论区留言。
参考:
http://c.biancheng.net/view/6499.html
https://www.cnblogs.com/ityouknow/p/7344001.html
推荐阅读
- 一次 RocketMQ 顺序消费延迟的问题定位
- RocketMQ基础概念剖析&源码解析
- 简单了解一下K8S,并搭建自己的集群
- HBase概述与体系结构
- Zookeeper原理解析&使用场景详解
- 同步MySQL数据到ES神器mysqlmom介绍
- 万字长文解密数据异构最佳实践(含完整代码实现)!!
- 深入了解Zookeeper核心原理
- Angular 服务器端渲染的学习笔记