HBase shell命令知识总结
1. HBase访问方式
- shell命令行客户端
- java api
本文主要总结关于shell命令行的知识点 - 不知道如何安装Hbase的可以看我另外一篇博文 HBase安装
PS:
- 可以横向对比,很多框架特别是运行在服务器端的,都会提供至少2种客户端,命令行客户端和代码api,部分如mysql还会有图形化客户端。
- 针对数据库框架的操作,主要就是查看、DML、DDL、如果比较强大还会有权限、数据备份等操作功能。
2. HBase的Shell概览
- 开启客户端
PS:
- 注意需要配置环境变量,否则就只能去HBase安装目录的bin目录下执行指令
- 注意使用shell客户端之前,先启动HBase集群(使用安装目录bin目录下的start-hbase.sh 指令,需要手动在集群中启动第二master节点服务 ./hbase-daemon.sh start master)

- 注意HBase版本是2.2.5(2020年5月份),官方最新版本是2.3.1(2020年8月份)

hbase shell
输入后出现如下图

2. 使用帮助命令
help
出现如下图所示,这些是hbase的shell命令组,按照功能进行了划分。

如果需要对某个命令进行帮助文档查询,直接help ‘xxx命令名’ 即可
help 'xxx命令名'

有文字说明,也有使用案例,还是很到位的文档支持的
- 退出shell 客户端
quit

这时候就退出了hbase shell客户端
- 输入某个指令进行操作(按照帮助文档的说明进行即可注意不同版本的shell命令以及接口api可能会有差异,所以最好的方式是对主要的功能命令有一个印象但不强求记住,其他命令查阅文档即可)

list_namespace

3. Shell命令细分
- 可以通过命令行客户端访问数据,也可以通过java api等访问数据
- 客户端提供了访问hbase的接口
- 提供cache提高访问hbase的效率 , 比如region的信息。因为进行数据读写都需要先去zookeeper请求元数据,这时候会把历史的meta请求数据缓存来提升效率。
- 以下命令都是按照官网文档来进行说明,如果英语🆗,更建议直接阅读官方文档,这样最新。我会基于
命令行使用方式
- 参数的分隔符是逗号 ,
- 参数形式是 {‘key1’ => ‘value1’, ‘key2’ => ‘value2’, …},常见的key有NAME, VERSIONS, COMPRESSION。常量不需要使用单引号括起来如数字常量,但字符串需要单引号括起来
- 命令输入后,按下enter键就执行
- 如果使用二进制形式的key,参考以下用法(不是很建议,需要这么操作建议在代码中进行)
hbase> get ‘t1’, “key\x03\x3f\xcd”
hbase> get ‘t1’, “key\003\023\011”
hbase> put ‘t1’, “test\xef\xff”, ‘f1:’, “\x01\x33\x40”
3.1 通用命令general
-
processlist,
查询是否有进行中的HBase任务

-
status,
查看HBase集群状态和信息

-
table_help,
关于table(表)操作的一些介绍和常见指令

-
version,
hbase软件版本以及发布日期

-
whoami
查询当前用户账号信息,
在数据库软件中,用户账号、密码和权限是直接挂钩的。默认是使用root权限登录进行操作,实际生产环境会有更严格的限制

3.2 数据定义语言(data definition language)ddl
3.2.1 alter,

如上所示,可以使用alter命令修改表中的列族(增加、删除、修改),也可以修改表的配置信息
- 增加一个列族
alter 'doit:tb_shoes', NAME=>'cf3', VERSIONS=>5
之前

之后

2. 删除一个列族
alter 'doit:tb_shoes', NAME=>'cf3', METHOD=>'delete'
注意区分大小写

执行完指令后,可以发现,之前创建的列族 cf3 已经被删除了

3. 设置协处理器(就是让数据处理逻辑代码运行在数据对应的region server上去,这样代码要处理的数据就在本地,避免网络数据传输的时间消耗。而且移动计算(代码)比移动数据快得多)
alter 't1',
'coprocessor'=>'hdfs:///foo.jar|com.foo.FooRegionObserver|1001|arg1=1,arg2=2'
协处理器是一套框架,后续会专门讲解,这里先提一下
3.2.2 alter_async

类似于异步修改,就是不需要等到所有的region块接收到结构改变信息就能修改列族结构和配置
- 增加一个或者多个列族,参数使用大括号包起来{},中间使用逗号隔开
alter_async 'doit:tb_shoes', {NAME=>'cf4'}, {NAME=>'cf5'},{NAME=>'cf6'}

执行后列族如下图

2. 删除一个列族
# 对namespace doit中的表tb_shoes进行列族删除,删除的列族是cf4
alter_async 'doit:tb_shoes', 'delete'=>'cf4'
如下图,执行后,列族cf4被删除

- 修改表配置信息(MAX_FILESIZE,
MEMSTORE_FLUSHSIZE, and READONLY)等都可以修改
alter 'doit:tb_shoes', METHOD=>'table_att', MAX_FILESIZE=>'134217728'
- 同时执行多个指令,指令通过大括号包起来
alter_async 'doit:tb_shoes', {NAME=>'cf8'}, {NAME=>'cf7', METHOD=>'delete'}
3.2.3 alter_status,

-- 查看表的修改状态,doit:tb_shoes中doit是namespace,tb_shoes是表名
alter_status 'doit:tb_shoes'

3.2.4. clone_table_schema,

-- 保留原有的splitkey,不保留就在后面加一个false参数即可
-- 旧表是doit:tb_shoes, 新表是doit:lining
clone_table_schema 'doit:tb_shoes', 'doit:lining'

3.2.5. create,
建表命令
注意:
- 由于HBase的表中,namespace(名称空间,类似于数据库的database概念)、table name(表名)、column family(列族)都需要指定,如果确定将要存入的数据划分,可以提前做region切分,通过设定split key数组(就是针对row key做划分)
- 所谓的region就是按照rowkey进行划分,从某一行起始,到某一行结束为一个region
- 列族就是对column进行管理,内部会包含多个column名。实际生产中一般会把有关联的列名放在一个列族中。如果是多个数据库导入到hbase中,有时候会采取一个表名就是一个列族,列族中字段就是这个表的字段。


# 创建表,所属namespace是doit,表名是computer,列族有3个,cf1、cf2、cf3
create 'doit:computer', 'cf1', 'cf2', 'cf3'

-- 创建数据表,列族名是cf1,保存数据最多4个版本,数据存活时间time to live是5小时,块缓存为true
-- block cache就是数据读取时,会分别从blockcache、memstore、store files中读取数据,然后合并为一份,这样各个版本的数据就能汇总到一起。
create 'doit:mouse', {NAME=>'cf1', VERSIONS=>4, TTL=>60*60*5, BLOCKCACHE=>true}

-- 设置预定义的分区词,也就是rowkey进行分区时,会根据['3', '6', '9']进行划分,分到小于3、3到6、6到9、大于9四个分区中。如果刚好是3,6,9,则放到下一个分区中,所以3是在3到6的分区中。左包右不包
create 'doit:keyboard', 'cf1', SPLITS=>['3', '6', '9']

3.2.6. describe,

describe 'doit:computer'

3.2.7. disable,

-- 让数据库表失效,这样读写操作都会关闭。但这时候可以对表结构等配置做设置
disable 'doit:computer'

3.2.8. disable_all,

-- 针对表级别做失效设置
disable_all 'doit:phone'

3.2.9. drop,
删除表
注意:
删除之前必须先disable,这样可以防止删除时表还有数据操作和访问

drop 'doit:phone'

3.2.10. drop_all,
批量删除,可以根据regex匹配数据库名,同样的,删除前记得先disable掉

3.2.11. enable,

enable 'doit:computer'

可以注意一下,enable的耗时对比disable的耗时
3.2.12. enable_all,

3.2.13. exists,

exists 'doit:xixi'

3.2.14. get_table,
类似定义一个变量,后续操作时可以使用这个变量。有一些类似于视图,或者视为定义一个变量。

t1 = get_table 'doit:mouse'

3.2.15. is_disabled,

is_disabled 'doit:mouse'

3.2.16. is_enabled,

is_enabled 'doit:mouse'

3.2.17. list,

list

3.2.18. list_regions,

# 如果是临时写入,注意先flush一下,这样数据会被从内存写入到磁盘文件中flush 'doit:thread'
list_regions 'doit:thread'

这里注意看几个数据,
(SERVER_NAME)如 linux101,16020,1598665887901
( REGION_NAME)如doit:thread,1,1598685252495.eca370a95ba01b52f63b4a0572e07383,看这里组成,doit是namespace,thread是数据表明,1是rowkey, 1598685252495是时间戳,eca370a95ba01b52f63b4a0572e07383这是计算编码后的region地址
(START_KEY)1
(END_KEY)3
( SIZE)0
(REQ)6
( LOCALITY)1.0
3.2.19. locate_region,

locate_region 'tableName', 'key0'

3.2.20. show_filters

show_filters

3.3 名称空间操作(类似于关系型数据库中的database) namespace
3.3.1 alter_namespace,

alter_namespace 'doit', {METHOD=>'set', 'ctime'=>'2020-08029'}


3.3.2 create_namespace,

create_namespace 'company', {'employees'=>'200', 'foundtime'=>'2018-08-07'}

3.3.3 describe_namespace,

获取描述信息,上述3.3.2已经截图演示
3.3.4 drop_namespace,
删除namespace需要先删除表,删除表需要先disable掉


drop_namespace 'thread'

3.3.5 list_namespace,

list_namespace

3.3.6 list_namespace_tables

list_namespace_tables 'thread'

3.4 数据操作语言(data manipulation language) dml
3.4.1 append,

之前

append 'thread:xixi', '1', 'cf1:job', ' and singer'
之后

3.4.1 count,

count 'thread:xixi'
3.4.1 delete,

HBase的删除,更新操作都是数据追加方式,也就是会追增一条新数据,等到一定时机时,再把这些数据做合并。delete就是增加一条标记数据,俗称墓碑标记
3.4.1 deleteall,

批量删除,可以删除行、列、region(一批连续的行)
3.4.1 get,

这里可以指定获取指定列和单元值的时候,如何解析数据。因为HBase本身没有数据类型,底层是以key value形式进行存储,读取也是如此。所以本质就是byte[]数组作为key和value,这样解析时,如果在存取的时候指定了格式(可以使用Bytes类进行指定也可以自定义类),那读取时就是用指定类去读取数据。
这一点和mapreduce中,数据存储、排序都是以key为基准,和这里的机制很相近。
3.4.1 get_counter,
获取计数

3.4.1 get_splits,

获取分区间隔(针对rowkey进行划分)
3.4.1 incr,

incr 'thread:xixi', '1', 'cf1:sal'
对某一个单元的值做统计,简单的累加,如计算网站的PV数
3.4.1 put,

往表里面添加数据,注意看这里只支持单个单个添加。因为本身hbase底层是key value形式存储。
如果需要批量导入,可以写程序,将数据转换成hfile形式,直接导入文件来做批量导入,后续会专门介绍。因为公司生产级别不太可能逐条导入,海量数据场景下,都是批量导入。
3.4.1 scan,

可以看做是sql中的select,filter就是select的where等限制条件
== 从接口和命令设计上可以看出,hbase对sql支持并不是很友好,后续会有phoenix组件来做转换支持在hbase上写sql做数据操作。但性能相比原生支持sql的clickhouse就会差很多了==
== clickhouse在2016年开源,从2018年开始国内陆续有腾讯、头条、携程部署click house集群来处理海量的结构化数据,节点从几百到几千都有。算是比较新但性能和潜力巨大的数据存储和查询处理框架==
3.4.1 truncate,

这个操作跟sql中的truncate功能一样,都可以删除表数据,但会保留表结构。
3.4.1 truncate_preserve

删除数据,保留比奥结构,还会保留region分区边界

这篇博客总结了HBase的shell命令,包括HBase的访问方式、shell概览和详细的命令细分,如数据定义语言(DDL)和数据操作语言(DML)。内容涵盖了创建、修改、删除表及列族,以及数据的增删查改等操作,是HBase管理的重要参考。
717

被折叠的 条评论
为什么被折叠?



