7.1 HBase的访问方式和HBase Shell
本节先介绍HBase访问方式,包括HBase提供的访问方式和SQL on HBase访问方式。再重点介绍HBase Shell命令行终端,包括如何进入HBase Shell终端环境,如何查看HBase Shell提供的常用操作命令。
7.1.1HBase的访问方式
1.HBase自身提供的访问方式
HBase属于典型的NoSQL非关系型数据库,不支持标准的SQL查询,但自身提供多种方式对数据库表进行访问和操作。HBase常见的数据库表访问方式如表7-1所示:
表7-1 HBase常见的数据库表访问方式
访问方式 |
简要说明 |
HBase Shell |
对HBase数据库表进行访问操作的简单命令行终端 |
Native Java API |
使用Java API编程接口对HBase数据库表进行高效的访问操作 |
Thirft Gateway |
利用Thirft序列化技术,支持C++、Python等多种编程语言,适用于其他异构系统在线访问HBase |
REST Gateway |
支持REST风格的Http API访问HBase,不受编程语言限制 |
MapReduce |
可直接使用MapReduce作业处理HBase数据,或通过Pig/Hive间接使用MapReduce处理HBase数据 |
其中HBase Shell是HBase最简单的访问方式,适合对HBase数据库表的管理和使用。MySQL用标准结构化查询语言SQL来操作结构化数据,Hive也有类SQL的HQL(Hive SQL)对存储在HDFS的数据进行操作。然而HBase并没有提供原生的SQL,不能执行select和insert/delete/update等标准SQL语句。HBase的HBase Shell命令行终端提供了类似Linux Shell终端命令的一系列操作命令,可通过执行HBase Shell命令对HBase数据库进行操作。
2.SQL on HBase的访问方式
从诞生开始HBase一直关注分布式系统的扩展性、容错性、读写性能优化等NOSQL特性,首要解决大数据存取和实时读写的问题,因此提供简单Get/Put/Scan接口命令即可满足用户的使用要求。随着HBase的发展成熟,应该功能更强大、操作更容易,因此也应该支持标准SQL语言。HBase不仅要支持SQL语言语法,也要满足SQL相关的数据处理方式和处理能力,实现NoSQL到NewSQL的进化。HBase本身不支持对原生数据表的标准SQL操作。如需使用标准SQL操作HBase,可采用SQL on HBase的方式将带标准SQL的上层框架与HBase集成,以使HBase支持标准SQL。常见的SQL on HBase方式有Phoenix on HBase、Hive on HBase和Spark on HBase等。
1)Phoenix on HBase
Phoenix是一种专门针对HBase设计的支持标准SQL的查询引擎,可通过SQL方式操作HBase。Phoenix on HBase是Phoenix和HBase的集成。在Phoenix中执行create语句创建表时,会自动调用HBase Java API在HBase创建对应的数据表。在Phoenix中执行insert语句向表中插入数据时,会自动调用HBase Java API在对应的HBase表中写入数据。
2)Hive on HBase
Hive是基于Hadoop的数据仓库工具,也可以成为为一种自带标准SQL的上层框架,可通过Hive on HBase方式操作HBase。Hive on HBase实质上是利用MapReduce on HBase实现的。HBase提供了MapReduce Java API编程接口MapReduce on HBase,可以编写MapReduce程序来操作HBase。Hive on HBase通过MapReduce on HBase,利用HBase数据表做为MapReduce的数据输入或者输出,利用MapReduce并行计算能力来操作HBase的数据表。
3)Spark on HBase
Spark和HBase都是Hadoop大数据生态系统的流行组件。Spark是基于内存的分布式计算框架。Spark on HBase是Spark和HBase的集成,可同时具备OLAP的功能和OLTP的功能。Spark on HBase使得用户无需关心Spark RDD与HBase的交互细节,能更方便地应用Spark带来的批、流处理等能力。Spark on HBase的常见应用场景如下:
(1)HBase作为数据存储,通过Spark执行流式数据计算
(2)HBase作为数据存储,通过Spark执行大规模的DAG图计算
(3)通过Spark对HBase进行BulkLoad批量数据导入操作
(4)通过Spark SQL对HBase进行交互式数据分析
7.1.2 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.7.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*
在HBase Shell终端输入单、双引号或其他特殊字符(非字母数字)并回车后,终端提示符形态会发生改变,具体含义如表7-2所示:
表7-2 HBase SHell终端提示符形态说明
输入字符内容 |
终端提示符形态 |
终端提示符表示含义 |
输入非数字、字符其他特殊字符 |
hbase(main):021:0* |
表示未输入完整的操作命令,等待继续输入 |
输入单引号字符 |
hbase(main):000:0’ |
表示输入命令中的单引号没有成对出现 |
输入双引号字符 |
hbase(main):000:0” |
表示输入命令中的双引号没有成对出现 |
输入一条完整命令 |
hbase(main):000:0> |
表示上一条命令已执行完,等待输入下一条命令 |
需要注意HBase Shell不支持中文,输入全角字符会导致HBase Shell终端出错退出。还需注意HBase Shell终端默认不支持BackSpace键(只支持Delete键),对命令输入造成不便。XShell等远程终端工具提供对键盘的Delete键和BackSpace键的键序列设置。只需将BackSpace键序列设为’ACSII 127’即可让HBase Shell终端的BackSpace键生效。如图7-1所示:
图7-1 让HBase Shell终端的BackSpace键生效的方法
2.HBase Shell操作命令分组
HBase Shell的帮助命令help给出了所有操作命令的快速参考说明。熟练掌握help命令可以快速了解HBase Shell提供的所有操作命令分组并学习各种命令的用法。在HBase Shell终端输入help命令会输出HBase Shell所有操作命令的分组,如表7-3所示:
表7-3 help命令输出HBase Shell所有操作命令的分组
分组名称 |
分组说明 |
包含的操作命令 |
general |
常规命令 |
status, table_help,version, whoami |
ddl |
数据表定义命令 |
alter,alter_async,alter_status,create,describe,disable,disable_all,drop,drop_all,enable,enable_all,exists,get_table,is_disabled, is_enabled, list locate_region, show_filters |
dml |
表数据操作命令 |
append,count,delete,deleteall,get,get_counter,get_splits,incr,put,scan, truncate,truncate_preserve |
namespace |
名字空间命令 |
alter_namespace,create_namespace,describe_namespace,drop_namespace, list_namespace, list_namespace_tables |
tools |
工具命令 |
assign,balance_switch,balancer,balancer_enabled,catalogjanitor_enabled,catalogjanitor_run,catalogjanitor_switch,close_region,compact,compact_mob,compact_rs,flush,major_compact,major_compact_mob,merge_region,move,normalize,normalizer_enabled,normalizer_switch,split,trace,unassign,wal_roll,zk_dump |
replication |
HBase集群复制命令 |
add_peer,append_peer_tableCFs,disable_peer,disable_table_replication,enable_peer,enable_table_replication,list_peers,list_replicated_tables,remove_peer,remove_peer_tableCFs,set_peer_tableCFs,show_peer_tableCFs |
snapshots |
快照命令 |
clone_snapshot,delete_all_snapshot,delete_snapshot,list_snapshots,restore_snapshot,snapshot |
configuration |
配置命令 |
update_all_config,update_config |
quotas |
资源配额命令 |
list_quotas,set_quota |
security |
安全命令 |
grant, list_security_capabilities,revoke,user_permission |
procedures |
过程命令 |
abort_procedure,list_procedures |
visibility labels |
可视化标签命令 |
add_labels,clear_auths,get_auths,list_labels,set_auths,set_visibility |
HBase Shell自带命令操作提示,输入命令名称后HBase Shell会自动提示该命令的完整用法。另外,由于HBase Shell实际是基于Ruby实现,理论上可以运行任何Ruby脚本代码,而非局限于只能执行上述help命令显示的所有操作命令。
HBase Shell的操作命令分组包括有general分组、ddl分组、dml分组和namesapce分组等。其中常用的DDL分组和DML分组的含义如下:
1)DDL分组
DDL代表数据定义语言(Data Definition Language),用于定义数据表的结构模式。DDL分组的操作命令都是针对数据表结构的操作。HBase提供的常用DDL命令有alter(修改表)、create(创建表)、describe(描述表)、drop(删除表)、list(列出所有表)等。
2)DML分组
DML代表数据操纵语言(Data Manipulation Language),用于对数据表中的数据进行操作。DML分组的操作命令都是针对数据表数据的操作。HBase提供的常用DML命令有scan(表扫描)、get(读数据)、put(写数据),delete(删除数据)等,
7.2 HBase Shell命令行的基础操作命令
本节主要介绍HBase Shell命令行的各种基础操作命令的用法格式、用法说明和用法示例,应能熟练掌握HBase Shell命令行的基础操作命令。
7.2.1 DDL分组的操作命令
DDL分组中包含的操作命令很多,主要用于对HBase数据库表的相关管理操作,主要包括创建表、修改表、删除表、列出表、启用表、禁用表等操作。DDL分组中常用操作命令说明和用法示例如表7-4所示:
表7-4 DDL分组中操作命令说明和用法示例
命令名称 |
命令说明 |
用法示例 |
alter |
修改表列族的属性 |
alter 't1', NAME => 'f1', VERSIONS => 5 |
alter_async |
异步修改表列族的属性,无需等待所有region都完成模式(列族属性)更新 |
alter_async 't1', NAME => 'f1', VERSIONS => 5 |
alter_status |
获取alter命令的执行状态,表明已有多少region已完成模式(列族属性)更新 |
alter_status 't1' |
create |
创建一张数据表 |
create 't1', 'f1', 'f2', 'f3' |
describe |
描述一张数据表的列族属性及该表是否禁用 |
describe 't1' |
disable |
启动一张数据表的禁用 |
disable 't1' |
disable_all |
禁用匹配正则表达式的所有数据表 |
disable_all 't.*' |
drop |
删除一张数据表,删除前必须先禁用该表 |
drop 't1' |
drop_all |
删除匹配正则表达式的所有数据表 |
drop_all 't.*' |
enable |
启动一张数据表的使用 |
enable 't1' |
enable_all |
启用匹配正则表达式的所有数据表 |
enable_all 't.*' |
exists |
判断一张数据表是否存在 |
exists 't1' |
is_disabled |
判断一张数据表是否禁用 |
is_disabled 't1' |
is_enabled |
判断一张数据表是否可用 |
is_enabled 't1' |
list |
列出所有的数据表名称(default名字空间和自定义名字空间) |
list |
locate_region |
显示指定表名、行键的某个region存放在哪个RegionServer |
locate_region 'tableName', 'key0' |
show_filters |
列出HBase中所有的过滤器 |
show_filters |
需要注意的是,HBase Shell命令中的表达式与其他语言不同,特别是列族符号的使用比较特殊。列族中的=>符号表示“等于”,例如NAME => 'f1'表示列族名等于f1。字符串必须用单引号或双引号,例如 't1'或“t1”表示列族t1。引用列族的多个属性需要用花括号,例如{NAME => 'f1', VERSIONS => 5}。
下面对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表列族中的多个属性都可用于性能调优。
HBase表列族中的常用属性如表7-5所示:
表7-5 HBase表列族中的的常用属性
列族属性 |
含义 |
NAME |
列族名称 |
BLOOMFILTER |
布隆过滤器 |
VERSIONS |
列值的最大版本数量 |
MIN_VERSIONS |
列值保留的最小版本数量 |
DATA_BLOCK_ENCODING |
是否进行数据块编码 |
IN_MEMORY |
数据是否优先存于内存中 |
BLOCKCACHE |
是否开启数据块缓存 |
BLOCKSIZE |
HBASE默认数据块大小 |
TTL |
列族中数据的生存时间 |
COMPRESSION |
列族中数据的压缩方式 |
KEEP_DELETED_CELLS |
是否保留删除的单元格 |
- 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