IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> HBase Shell命令行终端 -> 正文阅读

[大数据]HBase Shell命令行终端

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分组中的常用操作命令进行详细介绍。

  1. 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当前没有自定义名字空间。

  1. 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的数据表。

  1. describe命令

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

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

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

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

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

用法示例:描述表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',

{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

是否保留删除的单元格

  1. 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}、listdesc '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!

  1. 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...

数据表级别操作允许的属性必须是表级别的属性,如表7-6所示:

表7-6 表级别的属性列表

表级别的属性

含义

MAX_FILESIZE

最大文件大小

READONLY

设置表为只读

MEMSTORE_FLUSHSIZE

MemStore的大小超过阈值时将会发起flush请求

DEFERRED_LOG_FLUSH

延迟日志刷写

DURABILITY

是否持久化

REGION_REPLICATION

是否支持Region副本

NORMALIZATION_ENABLED

启用表的Region规划

PRIORITY

优先级

IS_ROOT

是否Root表

IS_META

是否Meta表

用法示例:修改表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'}}

  1. 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表示已禁用。

  1. 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表示已启用。

  1. 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表说明已被成功删除。

  1. 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列族属性更新完成。

  1. 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. 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编码、起止行键等。

7.2.2 DML分组的操作命令

DML分组中包含的操作命令很多,主要用于对数据表中的数据进行操作,主要包括全表扫描、读取单行数据、写入数据和删除数据等操作。DML分组中常用操作命令说明和用法示例如表7-7所示:

表7-7 DML分组中操作命令说明和用法示例

命令名称

命令说明

用法示例

append

向指定单元格中追加写入数据

append 't1', 'r1', 'c1', 'value'

count

统计数据表包含的总行数

count 't1'

delete

根据指定列删除一个数据单元格

delete 't1', 'r1', 'c1', ts1

deleteall

根据指定行或指定列删除所有单元格

deleteall 't1', 'r1'

deleteall 't1', 'r1', 'c1'

get

根据行键读取单行数据

get 't1', 'r1'

get 't1', 'r1', 'c1'

get_counter

读取计数器

get_counter 't1', 'r1', 'c1'

get_splits

获取指定表的所有分区数目

get_splits 't1'

incr

向指定单元格设置自增计数器

incr 't1', 'r1', 'c1'

put

向指定单元格写入一个单元格值

put 't1', 'r1', 'c1', 'value'

scan

根据指定条件进行全表扫描

scan 't1'

truncate

清空(禁用、删除和重建)表

truncate 't1'

  1. 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列族中的行键相同,才能将学生的基本信息和学生的成绩信息建立关联。

  1. 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能够精确查出数据列单元格指定时间戳的版本值,时间戳值必须精确到毫秒。

  1. 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

说明:报错原因是执行原始扫描不能指定任何列。

  1. 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语句。

  1. 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命令能执行但是不会报错也不会执行任何删除。

  1. 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 命令能执行但是不会报错也不会执行任何删除。

  1. 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命令。

  1. 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数据表,需要执行一段时间,先禁用表再清除表中的全部数据。

7.2.3 General分组的操作命令

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

  1. status命令

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

用法格式1:statusstatus 'summary'

用法格式2:status 'simple'

用法格式3: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数,活跃的master节点名称,并详细列出所有数据表的运行状态详细参数。于HBase系统管理员和运维工程师可以通过该命令监控HBase集群的运行状态细节。

  1. 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,并显示该版本的发布日期。

  1. whoami命令

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

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

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

root (auth:SIMPLE)

????groups: root

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

  1. 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脚本语言的解释器。

7.3 HBase Shell命令行的高级操作命令

本节主要介绍HBase Shell命令行的各种高级操作命令的用法格式、用法说明和用法示例,应能熟练掌握HBase Shell命令行的高级操作命令。

7.3.1 namespace分组的高级操作命令

名字空间(Namespace)是HBase对数据表的逻辑分组,用于对数据表进行业务划分。例如上层应用可以将不同业务的数据表分别存放在不同的名字空间,以实现不同业务数据表之间的数据隔离。名字空间和数据表是一对多关系,名字空间可以包含多张数据表,一张数据表只能属于一个名字空间。名字空间对应了HBase表存储在HDFS上的一个子目录。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是用户自定义的名字空间。

  1. 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行,而是代表创建成功。

  1. 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不允许被删除。

  1. 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中的表。

  1. 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。

  1. 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已被删除。?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

7.3.2 snapshot分组的高级操作命令

HBase快照(SnapShot)用于对HBase数据表的某个时刻的数据和状态进行备份,可避免意外删除数据而导致数据丢失。HBase在运行过程中不断有数据写入和删除,在某时刻对数据表做快照,可以把该时刻数据表的数据和状态固化下来,有点类似Virtual Box等虚拟机软件的快照恢复功能。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:给数据表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)表示命令执行成功。

  1. 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。

  1. 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生成快照时的属性相同。

  1. restore_snapshot命令

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

用法格式:restore_snapshot 'snapshotName'

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

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

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

1)执行disable 'students'命令禁用要进行快照恢复的表;

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

  1. 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查看快照,发现该快照已被删除。

  1. 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将会删除符合前缀条件的所有快照。

7.3.3 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的数据行。第1个Region的End Key和第2个Region的Start Key都等于拆分行键s003。

  1. 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。

  1. 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页面查看数据表的分区情况。

7.4使用过滤器进行HBase读数据操作

本节主要介绍什么是过滤器的HBase Shell命令行的各种高级操作命令的用法格式、用法说明和用法示例,应能熟练掌握常用HBase过滤器的用法和多种过滤器的组合用法。

7.4.1 HBase过滤器介绍

HBase的过滤器又称作下推判断器(push-down predicates),支持把数据过滤操作从客户端下推到服务端。HBase可以存储上亿行、上百万列的数据。HBase在执行读数据操作时使用过滤器。过滤器像筛子一样通过设置过滤条件只将符合条件的数据筛选出来,而不会读取无关数据。客户端发送带有过滤条件的RPC读数据请求,将过滤条件分发到各RegionServer。所有带过滤条件的读数据请求都被服务端RegionServer内部的过滤器进行处理。被过滤掉的数据不会被发送到客户端,可有效降低网络传输压力。HBase使用过滤器进行读数据操作如图7-2所示:

???

HBase设计为优先考虑写数据操作性能,牺牲读数据操作性能。使用过滤器的读数据操作是带过滤条件的,过滤无关数据也会消耗计算资源。因此使用过滤器虽然能避免对无关数据的读操作,但是也会对RegionServer读数据的性能造成一定影响。

过滤器在HBase Java API编程中应用较多,HBase Java API中提供了很多过滤器的操作类。过滤器有点类似SQL中的where查询条件,HBase Shell的读数据操作命令中可使用过滤器参数设置读操作时的数据过滤条件。带过滤器的get和scan命令是HBase Shell读数据操作的高级用法。

在HBase Shell终端执行命令show_filters会输出HBase全部类型的过滤器,HBase Shell全部类型过滤器的作用说明如表7-8所示:

表7-8 HBase Shell全部类型过滤器的作用说明

过滤器名称

中文含义

作用说明

DependentColumnFilter

参考列过滤器

根据列族和列限定符指定一个参考列,筛选出与参考列具有相同时间戳的所有数据列单元格

KeyOnlyFilter

仅行键过滤器

只筛选出每行的行键而不返回值

ColumnCountGetFilter

列计数过滤器

限定每行最多返回多少列,如果列数超过设置的限制值,将结束扫描操作

SingleColumnValueFilter

单列值过滤器

筛选出符合条件的单个数据列的列值

PrefixFilter

前缀过滤器

根据行健的前缀进行过滤

SingleColumnValue

ExcludeFilter

排除单列值过滤器

对不符合条件的单个数据列的列值进行过滤

FirstKeyOnlyFilter

仅首键过滤器

只筛选出每行中符合条件的第一个数据列单元格值

ColumnRangeFilter

列范围过滤器

筛选出符合最小值、最大值确定的列范围的数据列

TimestampsFilter

时间戳过滤器

筛选出时间戳值在指定的时间戳列表中的数据列单元格,可对扫描结果的版本进行细粒度控制

FamilyFilter

列族过滤器

筛选出符合指定列族名称的数据列单元格

QualifierFilter

列限定符过滤器

筛选出符合指定列限定符名称的数据列单元格

ColumnPrefixFilter

列前缀过滤器

筛选出符合指定列名前缀的数据列单元格

RowFilter

行键过滤器

筛选出符合指定行键的数据列单元格

MultipleColumn

PrefixFilter

多列名前缀过滤器

筛选出符合指定的多个列名前缀的数据列单元格

InclusiveStopFilter

含终止行过滤器

过滤时设置扫描的行键范围同时包含起始行和终止行

PageFilter

行分页过滤器

扫描结果按行键分页显示,设置每页最多显示的行数

ValueFilter

列值过滤器

使用正则表达式筛选出特定列值的数据列单元格

ColumnPaginationFilter

列分页过滤器

扫描结果列名分页显示,设置每页最多显示的列数

7.4.2 八种常用的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’命令查看写入结果。

  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’进行子串匹配,。

  1. 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做比较。

  1. 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('Ch')"命令,输出结果如下:

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'作比较。

  1. 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’的所有数据列。

  1. 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命令必须指定唯一确定完整的行键,没有必要再对行键前缀进行过滤。

  1. 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'。

  1. 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数据列,但是列值不满足过滤条件,因此没有被筛选出来。

  1. 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

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

  1. 多种过滤器的组合用法

执行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的数据列。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-16 11:21:36  更:2022-05-16 11:22:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/29 14:50:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码